问题背景:
我正在通过使用 Process 对象调用批处理文件来针对 MSTest.exe 运行指定的 dll。
代码:
我想确保此过程始终以提升的管理员权限运行。
我目前通过将进程
verb
属性设置为 runas
来做到这一点,如图所示:
try
{
_process.StartInfo.Verb = "runas";
_process.StartInfo.CreateNoWindow = true;
_process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
_process.StartInfo.Arguments = testLocation + " " + testDll;
_process.StartInfo.FileName = batchFileLocation;
_process.Start();
_process.WaitForExit();
}
catch (Exception ex)
{
throw ex;
}
问题:
这按预期运行,但用户帐户控制 (UAC) 提示要求确认我希望该进程运行 .exe。
由于此代码是自动化流程的一部分,我无法需要任何人工输入来单击提示上的“是”按钮,如何禁用 UAC 提示?
您无法绕过 UAC 提示。
问问自己:如果您在 Windows XP 上执行此操作,您会怎么做?
假设您正在运行一个没有 UAC 的操作系统。那么你的dll会做什么呢?您不再拥有 UAC 的便利,而是始终以标准用户身份运行。那么你的测试制度会做什么?
如果您不喜欢 UAC 对话框,可以将其关闭。但你的情况也不会更好,因为现在你就像在 Windows XP 上一样:一个标准用户,没有简单的方法摆脱它。
真正的解决方案是修复你的 dll 正在执行的受保护的操作。例如,如果这是一个 COM dll,并且自注册失败,因为您正在尝试写入 HKLM,那么您需要
C:\Program Files,那么您需要更改 C:\Program Files
上的安全设置以授予自己访问权限。解决方案是修复失败的地方。
这样做很容易。我在探索 Microsoft 文档的黑暗地下墓穴时意外发现了它。
通过 Win-R 启动本地安全策略应用程序 (secpol.msc)。打开本地策略树分支并单击安全选项。向下滚动“用户帐户控制:管理员批准模式下管理员提升提示的行为”条目的策略列表,然后双击它。从组合框下拉列表中选择“提升而不提示”,然后选择“确定”。
现在,UAC 将保护我们的系统,而不会烦扰我们提升为管理员凭据。它会自动为我们做这件事。即便如此,如果有人使用没有管理员权限的帐户登录,他们也会被烦扰。