繁体   English   中英

Process.Start("IIS Manager.lnk") 失败并显示“系统找不到指定的文件”

[英]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 类型

  • _shortcut.Exists 为真,所以可以找到文件
  • 将 _shortcut.FullName 替换为显式路径 @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk" 具有相同的效果。
  • 这是一个使用 Caliburn 和 MEF 的 WPF 应用程序。
  • 以管理员身份运行具有相同的效果。

另一方面,这在这里似乎有效:

    [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 7 x86 但不适用于 Windows 7 x64。

我最近碰到了这个。 基于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.UseShellExecutetrue

你能确定你是从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM