我的 "SYSTEM" 帐户下的 C# 代码 运行 如何在不触发提示的情况下启动需要提升的程序?

How would my C# code running under "SYSTEM" account start a program which requires elevation without triggering a prompt?

我的 C# 代码 运行 宁在一个遥远的 Windows 服务器上,我无法登录,只能部署代码。我想从该代码 运行 Process Monitor - 以 "quiet" 模式启动它,然后在一段时间后停止它。 运行 Process Monitor 的代码是 运行ning 在 "NT AUTHORITY\SYSTEM" 本地帐户下,所以我认为它具有所需的所有权限。

但是,如果我 运行 我的开发者盒子上的 Process Monitor 会触发权限提升提示。如果我从本地命令行 运行 它:

procmon /Terminate

然后我看到提升提示,确认提升并退出进程(如预期的那样)。

如果我从远程服务器上的 C# 代码中 运行 它:

using (var process = new System.Diagnostics.Process())
{
    process.StartInfo.FileName = pathToProcMonExe;
    process.StartInfo.Arguments = "/Terminate";
    process.Start();
    process.WaitForExit();
    WriteToLog("Exited");
}

然后看起来它只是挂在提升提示上,进程永远不会退出。

我再次无法登录并确认提升。我需要以编程方式完成所有事情。

我的进程 运行 在 "NT AUTHORITY\SYSTEM" 下。它如何 运行 Process Monitor 需要提升而不触发提示?

这里有一个相关的讨论 List of UAC prompt triggers? 这表明 UAC 对话框是由许多可能的决定触发的,包括注册表设置和可执行文件名。如果目标操作系统中的 UAC 提示未关闭,我认为您无能为力 - 操作系统正在尝试保护自己免受生成管理员级别系统实用程序而不通知用户的程序的侵害。

但是 - Process Monitor 应用程序中显示的进程监视器信息在 .net 的 System.Diagnostics 命名空间中可用,因此实际上不需要 shell 到 Process Monitor 获取数据你需要。

原来这不是提升提示。尽管是静默模式,但进程监视器显示的是 "here's my license agreement, please read and accept it" 对话框。接受许可协议后,Process Monitor 可以 运行 在该环境中没有提升提示就可以了。