编程语言
首页 > 编程语言> > C#Directory.exist始终在本地网络上返回false

C#Directory.exist始终在本地网络上返回false

作者:互联网

我正在尝试检查目录是否存在或本地网络是否存在.在对stackoverflow和MSDN进行了一些研究之后,我使用模拟方法开发了我的代码.问题是它的运行状况不是很好,Directory.exists()方法始终返回False这里有我的代码(与MSDN的代码几乎相同):

public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        private SafeTokenHandle()
            : base(true)
        {
        }

        [DllImport("kernel32.dll")]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [SuppressUnmanagedCodeSecurity]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool CloseHandle(IntPtr handle);

        protected override bool ReleaseHandle()
        {
            return CloseHandle(handle);
        }
    }

 class Environment
    {
        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
            int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public extern static bool CloseHandle(IntPtr handle);
        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_LOGON_INTERACTIVE = 2;

        private void m_SendAlertes()
        {
                SafeTokenHandle safeTokenHandle;
                string v_pathToDir = "\\192.168.1.199\Clients SiteInternet";

                if (!LogonUser("RKalculateur", "SERVEUR2", 
                                "riskedge", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle))
                {
                    int ret = Marshal.GetLastWin32Error();
                    throw new System.ComponentModel.Win32Exception(ret);
                }
                using (safeTokenHandle)
                {
                    using (WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle()))
                    {
                        using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
                        {
                            if (Directory.Exists(@v_pathToDir))
                            {
                               // Proceed code here
                            }
                        }
                    }
                }
        }
    }

在这里,您可以看到该目录的权限:

解决方法:

这可能是与用户权限有关的问题.

从MSDN:

If you do not have at a minimum read-only permission to the
directory, the Exists method will return false.

如果您使用本地帐户而不是域帐户,则使用Directory.Exists()方法是有问题的.

过去我也遇到过类似的问题:我必须检查网络中是否存在网络共享,并且没有域.你的方式对我不起作用.最后,我放弃了Directory.Exists()方法,最后使用NET USE命令(http://www.cezeo.com/tips-and-tricks/net-use-command/)

bool exists = false;
string output = "";
string error = "";

System.Diagnostics.Process process = new System.Diagnostics.Process();
process = new System.Diagnostics.Process();
            ExecuteShellCommand(process, "NET USE", "\""+ @path + "\" "+
               this.password+ " /USER:"+machinename+"\\"+username + " /PERSISTENT:NO",
               ref output, ref error);
Console.WriteLine("\r\n\t__________________________"+
                "\r\n\tOutput:" + output.Trim().Replace("\r", " ") +
                "\r\n\tError: " + error.Trim().Replace("\r"," "));

            if (output.Length>0 && error.Length==0)
            {
                exists = true;
            }

            process = new System.Diagnostics.Process();
            ExecuteShellCommand(process, "NET USE", " /DELETE " + @path,
                ref output, ref error);

….

public void ExecuteShellCommand(System.Diagnostics.Process process, string fileToExecute,
        string command, ref string output, ref string error)
    {
        try
        {
            string CMD = string.Format(System.Globalization.CultureInfo.InvariantCulture, @"{0}\cmd.exe", new object[] { Environment.SystemDirectory });
            string args = string.Format(System.Globalization.CultureInfo.InvariantCulture, "/C {0}", new object[] { fileToExecute });
            if (command != null && command.Length > 0)
            {
                args += string.Format(System.Globalization.CultureInfo.InvariantCulture, " {0}", new object[] { command, System.Globalization.CultureInfo.InvariantCulture });
            }

            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(CMD, args);

            startInfo.CreateNoWindow = true;
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardInput = true;
            startInfo.RedirectStandardError = true;

            process.StartInfo = startInfo;

            process.Start();

            // timeout
process.WaitForExit(10 * 1000);
output = process.StandardOutput.ReadToEnd();
             error = process.StandardError.ReadToEnd();
        }
        catch (Win32Exception e32)
        {
            Console.WriteLine("Win32 Exception caught in process: {0}", e32.ToString());
        }
        catch (Exception e
        {
            Console.WriteLine("Exception caught in process: {0}", e.ToString());
        }
        finally
        {
            // close process and do cleanup
            process.Close();
            process.Dispose();
            process = null;
        }
    }

我知道这是一个hack,但是对我有用,这是有可能的. (尽管您可能需要设置适当的净份额)

标签:impersonation,networking,directory,c
来源: https://codeday.me/bug/20191031/1972680.html