【问题标题】:run shell command (manage-bde) as administrator from C#从 C# 以管理员身份运行 shell 命令 (manage-bde)
【发布时间】:2013-05-20 12:52:32
【问题描述】:

我需要从 C# 代码运行“manage-bde”shell 命令。

主应用程序进程已经以管理员身份运行并且已提升。

我使用了来自 MS 网站上的 UAC 自提升示例的代码来确认应用进程已提升。 (http://code.msdn.microsoft.com/windowsdesktop/CSUACSelfElevation-644673d3)

但是,当我尝试从 C# 代码运行 manage-bde 时,我得到“系统找不到指定的文件”。

        Process p = new Process();
        p.StartInfo.FileName = "C:\\Windows\\System32\\manage-bde.exe";
        p.StartInfo.UseShellExecute = true;
        p.Start();

作为一种解决方法,我尝试创建一个运行该命令的批处理文件。

        string batchFileName = DateTime.Now.Ticks + ".bat";
        StreamWriter writer = new StreamWriter(batchFileName);
        writer.WriteLine("manage-bde");
        writer.Flush();
        writer.Close();               
        Process p = new Process();
        p.StartInfo.FileName = batchFileName;               
        p.StartInfo.UseShellExecute = true;                             
        p.Start();

批处理文件写入,执行成功;但是,无法识别命令“manage-bde”。

我将代码更改为使用动词“runas”并使用管理员密码,这很有效,但我希望批处理文件无需提供管理员密码即可工作。当前登录的用户已经是计算机上的管理员,但批处理文件没有以现有的管理员权限执行。我需要批处理文件来执行和 manage-bde 才能成功运行。

我们将非常感谢您的帮助或建议 :)

ps:manage-bde 以外的一些命令可以正常工作,无需管理员运行。

【问题讨论】:

  • I used code from : UAC self-elevation example on MS website for confirming the app process is elevated,如果是这种情况,则涉及大量代码,包括对本机 Windows API 的调用。您是否完全实施了解决方案?它还使用 Windows 身份框架。同样,您是否完全实施了该示例中的解决方案?
  • 我添加了 NativeMethods.cs 并从该示例中复制了相关函数“IsElevated”;该函数返回 true 。我用它来确认我的进程在运行批处理文件进程时处于提升级别
  • 使用用户名和密码调用“RunAs”会导致 process.start 调用本机方法 (CreateProcessWithLogonW)。这将创建一个新的安全上下文并从中运行应用程序(在本例中为 manage-bde)。这个新的安全上下文是一个 64 位的上下文,它在访问 system32 时不会被重定向。如果我不使用用户名和密码,调用的本机方法将是:(CreateProcess)。这将在调用应用程序的相同安全上下文中启动新进程(在我上面的例子中是 32 位上下文)。结果访问被重定向到 syswow64 并且找不到文件。

标签: c# .net shell


【解决方案1】:

我遇到这种行为的原因是 Windows 文件系统重定向器。

在大多数情况下,每当 32 位应用程序尝试访问 %windir%\System32 时,访问都会重定向到 %windir%\SysWOW64

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx

我的应用程序版本是 32 位。每当它试图访问 System32 窗口时,它会自动将其重定向到不包含“manage-bde.exe”的 SysWow64。我将构建更改为 64 位,然后应用程序可以从 System32 访问 manage-bde.exe

【讨论】:

    【解决方案2】:

    即使您以管理员用户身份运行,如果 UAC 正在运行,您也不会完全提升。这意味着您要么会出现 UAC 提示,要么会提示您输入密码。

    解决这个问题的唯一真正方法是首先运行提升的应用程序,或者编写一个以提升的权限运行的服务来启动新进程。

    当然,另一种选择是禁用 UAC,但在大多数情况下这是不可取的。

    【讨论】:

    • OP 明确指出but I want the batch file to work without the need for providing the admin password 使该解决方案完全无效。
    • @MichaelPerrenoud 没有注意到这一点,感谢您指出这一点。我已经更新了我的答案。
    • @PhonicUK 感谢您的回复。在我启动进程的点 (Process.Start()) ,我的调用进程被提升。我通过从上面提到的代码调用 IsElevated 确认了这一点。它只有在我提供 runas verb 时才能成功运行,并使用进程 startInfo 输入管理员用户名和密码
    猜你喜欢
    • 2013-02-15
    • 2012-04-18
    • 2011-08-22
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多