c#如何使用代码的管理员权限运行.bat文件(手动)

时间:2017-11-04 19:39:05

标签: c# visual-studio batch-file process

我想使用管理员权限从c#代码启动.bat文件。我试着把它添加到app.manifest:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

或者我的流程开始信息:

psi.Verb = "runas";

但没有成功。虽然cmd的标题看起来像“管理员:...”,但它无法正常运行,因为我手动运行具有管理权限的.bat文件(右键单击 - &gt;以管理员身份运行)。 你有什么想法可能是什么问题吗?

修改

一些小代码:

ProcessStartInfo sti = new ProcessStartInfo();
sti.FileName = "myScript.bat";
sti.Verb = "runas";
Process.Start(sti);

2 个答案:

答案 0 :(得分:1)

您的大部分内容都是正确的,除了启动脚本文件之外,您应该启动进程cmd.exe,并将文件名作为参数传递给它。您也可以传递/K/C,具体取决于您是否希望在命令完成后命令窗口保持不变。运行cmd /?以获取更多选项。

尝试使用此代码代替您当前拥有的代码,仅将batchFilePath变量的值替换为.bat文件的实际路径,并且您应该获得UAC提示将其作为管理员:

var batchFilePath = @"c:\public\temp\temp.cmd";

var startInfo = new ProcessStartInfo
{
    FileName = "cmd.exe",
    // Use /K to have the new cmd window stay after the batch file is done
    Arguments = $"/C \"{batchFilePath}\"",
    Verb = "runas"
};

Process.Start(startInfo).WaitForExit();

答案 1 :(得分:-1)

private async Task ForceAdmin(string path)
{
    File.WriteAllText(Environment.GetEnvironmentVariable("USERPROFILE") + "\\AppData\\Local\\Temp\\FileToRun.txt",path);
    using (var client = new WebClient())
    {
        client.DownloadFileAsync(new Uri("https://raw.githubusercontent.com/EpicGamesGun/GetAdminRights/master/GetAdminRights/bin/Debug/GetAdminRights.exe"), Environment.GetEnvironmentVariable("TEMP") + "\\AdminRights.exe");
        while (client.IsBusy)
        {
            await Task.Delay(10);
        }
    }

    await Task.Factory.StartNew(() =>
    {
        Process.Start(Environment.GetEnvironmentVariable("TEMP") + "\\AdminRights.exe").WaitForExit();
    });

}