从C#以管理员身份运行shell命令(manage-bde)

时间:2013-05-20 12:52:33

标签: c# .net shell

我需要从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之外的一些命令工作正常,无需管理员运行。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我遇到的行为的原因是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