我正在尝试以不同的用户身份运行一个进程,该用户在运行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”
答案 0 :(得分:13)
您需要指定ProcessStartInfo`的WorkingDirectory
属性。来自Win32Exception error code 267 "The directory name is invalid":
我目前正致力于" Automated Run As"工具。它的目标是 帮助管理员,像我一样,必须为用户提供执行方式 一个或两个程序作为管理员,并希望没有 不得不放弃管理员的密码。
所以,我在Vista上开发,我只是掀起了一个小小的证据 概念原型,运行calc.exe作为不同的用户,使用 ProcessStartInfo和Process。当我执行它时,这工作正常 我自己(一个相当无意义的运动,我必须承认),但是当我创造时 一个新用户,并试图像他一样运行它,我偶然发现了一个 Win32Exception抱怨目录名无效,本机 错误代码267.我当时感到困惑,因为我知道没有提供 目录名称可能无效。然后我在XP上测试了代码 机器,它工作!
我开始谷歌上搜索无济于事,但很多报道都有这个错误 没有决定性的解决方案,或在不同的背景下。最后,经过一个 虽然我突然意识到,但我还没有指定WorkingDirectory ProcessStartInfo类的属性,只要我添加了行
FileInfo fileInfo = new FileInfo(path); startInfo.WorkingDirectory = fileInfo.DirectoryName;
对于我的代码,允许运行与登录时不同的代码 用户。 ...
答案 1 :(得分:3)
目录是登录用户的映射主文件夹还是下面的目录?这篇知识库文章可能有所帮助:
更新:请注意,作为本地管理员组的成员并具有管理权限在Vista上并不相同。
我认为当您以管理员身份运行C#应用程序时,一切正常。右键单击可执行文件,然后选择以管理员身份运行,或从提升的命令提示符启动应用程序(通过按开始,输入'cmd,获取一个应用程序的最快方法'后跟Ctrl+Shift+Return
)。
或者,作为替代方案,为运行该过程的帐户禁用UAC。
答案 2 :(得分:3)
尝试替换
pInfo.WorkingDirectory = New System.IO.FileInfo(myFile).DirectoryName;
带
pInfo.WorkingDirectory = Path.GetDirectoryName(myFile);
FileInfo可以访问文件系统,我认为只有admin用户才能访问该目录。如果它不能解决您的问题,至少它会使您的代码更快一点......
答案 3 :(得分:2)
这是因为文件的路径长度超过255个字符。
答案 4 :(得分:2)
这是由于文件夹名称中的空格。一旦我删除了空间,当我遇到这个问题时它开始处理文件。
答案 5 :(得分:2)
我有类似的经历,结果证明我们的开发环境存在问题。我们使用subst命令将源代码目录映射到虚拟驱动器。所以FileName和WorkingDirectory属性被设置为“W:\ SomeFolder \ FileName.exe”
当我硬编码FileName& WorkingDirectory通过我的实际磁盘(C :)访问文件,我停止接收“无效目录”异常。