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

2024-06-23

我正在尝试检查目录是否存在于非网络或本地网络上。经过对 stackoverflow 和 MSDN 的一些研究后,我使用模拟方法开发了我的代码。问题是它运作得不太好,Directory.exists()方法总是返回False这是我的代码(它与来自的代码几乎相同)):

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
                            }
                        }
                    }
                }
        }
    }

Here you have a picture of the rights for this directory : enter image description here


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

来自 MSDN:

如果您没有至少只读权限 目录,Exists 方法将返回 false。

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

我过去也遇到过类似的问题:我必须检查我的网络中是否存在网络共享并且没有域。你的方法不适合我。最后,我放弃了 Directory.Exists() 方法并最终使用 NET USE 命令(http://www.cezeo.com/tips-and-tricks/net-use-command/ 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;
        }
    }

我知道这是一个黑客,但它对我有用,而且是有可能的。 (尽管您可能需要设置适当的网络共享)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# Directory.exist 在本地网络上始终返回 false 的相关文章

随机推荐

  • SublimeREPL 无法找到 R

    好吧 这让我发疯 我之前已经设置过 删除了 Sublime Text 现在我不记得正确的配置是什么 非常简单 我通过 SublimeREPL 运行 R 并且需要将 REPL 指向安装 R 的位置 我按照以下指示进行操作http sublim
  • 非成员运算符重载应该放在哪里?

    我想要超载operator lt lt 为了我的班级 我应该将这个重载定义添加到std命名空间 自从ostream operator lt lt 是的一部分std命名空间 或者我应该将其保留在全局命名空间中 简而言之 class MyCla
  • 为什么即使是非常简单的应用程序,MonoTouch 也会导致大量内存泄漏(根据 Instruments 的报告)?

    我正在使用 Instruments 运行一个非常基本的测试应用程序 它发现了很多内存泄漏 因为我知道 Apple 人员在将应用程序提交到 iTunes 时会检查内存泄漏 所以我想调查一下这个问题 我的环境 Mac OS X 10 6 6 上
  • svn 切换错误 - 不是同一个存储库

    我最近移动了 SVN 服务器 现在我正在尝试将工作副本从我的计算机重新定位到新服务器 但我得到了最奇怪的错误 我愿意 svn switch http 99 99 99 new svn company project trunk web 但我
  • 在标签上运行管道时如何获取分支名称?

    我从标签运行管道 比方说v1 0 0 在一个分支上 比方说staging 我的输出文件是用创建的 CI PROJECT NAME CI COMMIT REF NAME apk 结果是一个名为MyProject v1 0 0 apk 我希望在
  • 从 .gitlab-ci.yml 中的 JSON 中提取徽章 ID

    我有一个示例项目 https gitlab com mstein badge number example repo在 gitlab 中 我想获取最后一个徽章的 ID gitlab ci yml通过脚本 我了解所有徽章的概览作为 json
  • 如何避免 Google App Engine 标准环境中 Gorilla 会话的内存泄漏?

    我正在使用 Gorilla 在 Google App Engine 上启用会话变量 到目前为止 我只导入了 github com gorilla sessions 但 Gorilla 的页面显示 如果您不使用 gorilla mux 则需要
  • 将 Dynamo DB 流数据解组为 Json 格式

    我必须将DDB流消息转换为正常的json类型 为此我正在使用 unmarshalleddata aws DynamoDB Converter unmarshall result NewImage 其中 result NewImage 是 c
  • 如何在 Angular js 中创建动态工厂?

    在我的项目中 我必须在 Angular js 中创建动态工厂 其动态工厂名称如下 function createDynamicFactory modId return myModule factory modId existingServi
  • 从对象数组中删除重复项

    我有一堂课叫Customer它有几个字符串属性 例如 firstName lastName email etc 我从a读取客户信息csv创建类数组的文件 Customer customers 我需要删除具有相同电子邮件地址的重复客户 为每个
  • GUID 幕后花絮

    我想知道 GUID 的创建过程是怎样的 我的意思不是用什么来以特定语言创建 GUID SQL Server 中的 NewID C 中的 Guid NewGuid 我的意思是当你调用这些方法 函数时 它们会做什么来使图形用户界面 Also R
  • 如何在 Python 中打印异常?

    如何打印错误 异常except block try except print exception 对于 Python 2 6 及更高版本和 Python 3 x except Exception as e print e 对于 Python
  • 如何在 PHP 中解析 OFX(版本 1.0.2)文件?

    我有一个OFX http www ofx net 文件下载自Citibank https www citibank com co 该文件的 DTD 定义在http www ofx net DownloadPage Files ofx102s
  • 从 Laravel 中的命令调用控制器方法

    我有一个通过 Redis Pub Sub 监听的命令 收到发布后 我想调用控制器方法 以便可以更新数据库 但是 我无法找到任何关于如何从项目内部但在路由外部调用带有参数的控制器方法的解决方案 我见过的最接近的东西是这样的 return re
  • R Shiny Dashboard 在初始化时不会在 sidebarMenu 内加载渲染的 UI

    我正在尝试根据用户希望如何提供输入来生成动态的 UI 元素 为了简单起见 我使用闪亮的仪表板 但我遇到了侧边栏菜单的问题 以前 当我将静态 UI 元素直接放入 sidebarMenu 中时 没有任何问题 但是当尝试将动态 UI 元素放入 s
  • 什么是日历队列?

    我正在致力于构建一个离散事件模拟器 维基百科提到有几种通用优先级队列非常适合在 DES 中使用 具体来说 它提到日历队列是一个很好的结构 我找到了一份 pdf 1988 年的 其中提到了日历队列 但在大多数情况下我找不到关于它们的任何其他内
  • 如何在 python 套接字中使用浏览器作为客户端?

    我试图在互联网上搜索这个主题 但我没有找到一些答案 如果有人知道如何在 python 套接字中使用浏览器作为客户端 那就太好了 要将浏览器用作 python 服务器 套接字的客户端 您只需将其指向正确的端点即可 假设您在同一台计算机上运行浏
  • 当脚本执行暂停时,如何在 chrome devtools 中运行异步代码?

    await Promise resolve 1 在 chrome devtools chrome 版本 70 0 3538 77 中解析为 1当脚本执行未暂停时 Promise
  • 整个 Inno Setup 安装程序的完整性检查

    我们使用 Inno Setup 作为安装程序 最近有用户在安装过程中报告如下错误 尝试复制文件时发生错误 源文件已损坏 这是由于安装文件确实已损坏 理想情况下 安装 EXE 会在初始化时执行某种检查 以查看整个 EXE 是否有效 但显然它只
  • C# Directory.exist 在本地网络上始终返回 false

    我正在尝试检查目录是否存在于非网络或本地网络上 经过对 stackoverflow 和 MSDN 的一些研究后 我使用模拟方法开发了我的代码 问题是它运作得不太好 Directory exists 方法总是返回False这是我的代码 它与来