[英]Error in Process.Start() – The System cannot find the file specified
[英]Process.Start("IIS Manager.lnk") fails with "The system cannot find the file specified"
我正在通过Process.Start
启动路径C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk
,但失败并The system cannot find the file specified
。
该链接显示在dir
上,因此它存在。
可以是权限吗?
笔记:
Start Menu
目录自动发现的。说明:
代码如下:
public void Execute() { Process.Start(_shortcut.FullName);}
_shortcut 是 FileInfo 类型
另一方面,这在这里似乎有效:
[Fact]
public void TestIisManager()
{
var path = new FileInfo(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk");
Process.Start(path.FullName);
}
它似乎确实有点基于“环境”。
第二个澄清:
我最近碰到了这个。 基于Windows Forms的解决方案,VS2013,x64机器。 Process.Start()无法通过.lnk文件启动应用程序。 使用进程资源管理器,似乎.lnk文件中指定的目标无法正确解析为c:\\ program files(x86)...而不是c:\\ program files ...我遵循了Bruno的出色建议,但后来又是我的目标已被标记为“AnyCPU”。
经过一番搔痒,结果发现在VS11 +中有一个名为“Prefer 32-bit”的新编译器标志,默认情况下已经检查过。 即使我的操作系统是64位且平台设置为AnyCPU,这也迫使EXE输出为32位。 在取消选中并重新编译后,问题得到解决。
更多阅读: http : //blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/
发现了这个问题。
WPF应用程序编译为x86(所有其他dll编译为AnyCPU),并且在64位计算机中启动某些可执行文件或链接时失败。
将“平台目标”更改为AnyCPU可以解决此问题。
这实际上可能与您的情况无关,但您可以使用启动IIS管理器
Process.Start("inetmgr.exe")
如果你想继续使用该快捷方式,如果你使用一个启动过程中它可能会工作ProcessStartInfo
并设置ProcessStartInfo.UseShellExecute
至true
你能确定你是从STA线程尝试这个吗? 如果以下示例成功,您可以查看公寓状态是否有问题:
using System;
using System.Diagnostics;
public class Program
{
// make sure to call Process.Start from an STA thread
[STAThread]
static void Main(string[] args)
{
Process.Start(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk");
}
}
Process.Start
调用ShellExecute
来运行传递的文件。 正如Raymond Chen所描述的,shell函数需要一个STA线程:
ShellExecute返回SE_ERR_ACCESSDENIED和ShellExecuteEx的一个可能原因是返回ERROR_ACCESS_DENIED
如前所述,您将看到“系统找不到指定的文件”错误,因为Windows正在...\SysWOW64\intsrv\中寻找 .netmgr.exe(由文件系统重定向引起),但它仅存在于. ..\System32\intsrv\ 。
这是由您的 32 位可执行文件试图启动 64 位可执行文件引起的。 正如建议的那样,不使用 32 位可执行文件将解决此问题,但对于必须构建 32 位(在我的情况下为 WiX 安装程序包)的任何人,请尝试以下操作。
使用开始菜单 LNK/快捷方式到 .netmgr.exe 而不是可执行文件是一个好的开始,但需要额外的距离。 这可以通过使用explorer.exe来提供,它可以从 32 位可执行文件启动:
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.FileName = "explorer.exe";
startInfo.Arguments = "/seperate /root,\"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Administrative Tools\\IIS Manager.lnk\"";
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = startInfo;
process.Start();
这有点像黑客,但尝试启动它像这样:
string path = @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk";
Process.Start("cmd.exe", String.Format("/k \"\"{0}\"\"",path));
请注意保存路径中的空格所需的双引号。 这样,您可能会看到更精确的错误消息和/或在命令环境中四处走动,看看路径有什么问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.