【问题标题】:Win32Exception: The directory name is invalidWin32Exception: 目录名无效
【发布时间】:2010-11-02 16:44:34
【问题描述】:

我正在尝试以具有管理员权限的不同用户身份运行进程,该用户在运行 Vista 并启用了 UAC 的 2 台不同计算机上运行,​​但在其中一台计算机上出现 Win32Exception,显示“目录名称无效”

谁能告诉我我的代码有什么问题?

var myFile = "D:\\SomeFolder\\MyExecutable.exe";
var workingFolder = "D:\\SomeFolder";
var pInfo = new System.Diagnostics.ProcessStartInfo();
pInfo.FileName = myFile;
pInfo.WorkingDirectory = workingFolder;
pInfo.Arguments = myArgs;
pInfo.LoadUserProfile = true;
pInfo.UseShellExecute = false;
pInfo.UserName = {UserAccount};
pInfo.Password = {SecureStringPassword};
pInfo.Domain = ".";

System.Diagnostics.Process.Start(pInfo);

更新

执行上述代码的应用程序具有 requireAdministrator 执行级别。 我什至将工作文件夹设置为 "Path.GetDirectoryName(myFile)""New System.IO.FileInfo(myFile).DirectoryName"

【问题讨论】:

  • 错误出现在哪一行代码中?是在创建 FileInfo 对象时还是在启动进程时?
  • @divo System.Diagnostics.Process.Start(pInfo)
  • 您可以使用进程监视器(来自 Sysinternals)来确定哪个底层 Win32 文件/文件夹操作失败。
  • 顺便说一句,您可以使用字符串文字来避免在路径中转义斜杠,例如,var myFile = @"D:\SomeFolder\MyExecutable.exe";
  • 如果您的 SomeFolder 路径包含 Program Files (x86) 文件夹,Visual Studio 或其他工具会神秘地删除 's' 和 '(' 之间的空格并将其设为“Program Files(x86)”。也许你错过了这个错字

标签: c# processstartinfo win32exception


【解决方案1】:

您需要指定 ProcessStartInfo` 的 WorkingDirectory 属性。来自Win32Exception error code 267 "The directory name is invalid"

我目前正在开发“自动运行方式”工具。它的目标是 帮助像我一样必须为用户提供执行方式的管理员 一个或两个作为管理员的程序,并且希望在没有的情况下这样做 必须交出管理员密码。

所以,我在 Vista 上进行开发,我只是做了一个小证明 概念原型,以不同用户身份运行 calc.exe,使用 ProcessStartInfo 和进程。当我执行它时,这很好用 我自己(一个相当无意义的练习,我必须承认),但是当我创建 一个新用户并试图以他的身份运行它,我偶然发现了一个 Win32Exception 抱怨目录名无效,本机 错误代码 267。我很困惑,因为我知道没有提供 可能无效的目录名称。然后我在 XP 上测试了代码 机器,它工作了!

我开始用谷歌搜索无济于事,许多关于该错误的报告,但 没有决定性的解决方案,或在不同的情况下。最后,经过 虽然我突然意识到,但我没有指定 WorkingDirectory ProcessStartInfo 类的属性,只要我添加了行

FileInfo fileInfo = new FileInfo(path); startInfo.WorkingDirectory = fileInfo.DirectoryName;

对于我的代码,允许运行与登录不同的代码 用户。 ...

【讨论】:

  • 我添加了类似目录名的字符串,但不起作用。但是在我改变这个答案之后FileInfo fileInfo = new FileInfo(path); startInfo.WorkingDirectory = fileInfo.DirectoryName;工作正常。很奇怪。
【解决方案2】:

我有过类似的经历,结果证明是我们的开发环境存在问题。我们使用 subst 命令将源代码目录映射到虚拟驱动器。所以 FileName 和 WorkingDirectory 属性被设置为“W:\SomeFolder\FileName.exe”

当我硬编码文件名和工作目录以通过我的实际磁盘 (C:) 访问文件时,我不再收到“无效目录”异常。

【讨论】:

    【解决方案3】:

    这是由于文件夹名称中的空格所致。一旦我删除了空间,当我遇到这个问题时它就开始工作了。

    【讨论】:

    • 即使我们在路径中没有空间,这也不起作用
    【解决方案4】:

    这是因为文件的路径长度超过了 255 个字符。

    【讨论】:

    • 谢谢,这对我也有用,我在文件名属性中设置了我的整个路径和文件名,而是将你的路径放在“工作目录”属性下,将文件名属性留给“文件名”。
    【解决方案5】:

    该目录是登录用户映射的主文件夹还是低于该目录?这篇知识库文章可能会有所帮助:

    "The directory name is invalid" error message when you start Cmd.exe or Notepad.exe by using the Run as feature in Windows

    更新:请注意,作为 Local Administrators 组的成员和拥有管理权限在 Vista 上是不同的。

    我想当您以管理员身份运行 C# 应用程序时一切正常。右键单击可执行文件,然后选择以管理员身份运行,或从提升的命令提示符启动应用程序(获得的最快方法是按开始,输入'cmd ' 后跟 Ctrl+Shift+Return)。

    或者,作为替代方案,为运行该进程的帐户禁用 UAC。

    【讨论】:

    • 目录是非系统驱动器中的普通目录,对管理员组具有完全控制权限。
    • 运行第二个进程的应用程序具有requireAdministrator执行级别。因此它将以管理员身份运行。
    • "...为运行该进程的帐户禁用 UAC" - 当您开始这样做时,几乎不可能返回。就像穿越到黑暗的一面。
    【解决方案6】:

    尝试替换

    pInfo.WorkingDirectory = New System.IO.FileInfo(myFile).DirectoryName;
    

    pInfo.WorkingDirectory = Path.GetDirectoryName(myFile);
    

    FileInfo 可以访问文件系统,我假设只有管理员用户可以访问该目录。如果它不能解决你的问题,至少它会让你的代码更快一点......

    【讨论】:

    • 不能解决问题。我什至指定了一个静态地址。
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2017-04-18
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多