我有一个需要管理员权限的应用程序。它有一个包含所需安全设置的清单:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
由于普通用户应能够运行此程序,因此安装程序会添加具有管理员权限的技术用户。用户现在调用一个启动器应用程序,该应用程序尝试使用此帐户和存储的密码在升级的上下文中调用目标应用程序。
启动器在其清单中包含以下设置:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
调用目标应用程序时,我可以切换用户或提升上下文,但不能同时提升两者。这是我的(简化)尝试:
public static Process RunElevatedIn(string userDomain, string userName, string userPassword, string workingDirectory, string programPath, string arguments)
{
if (userName != null)
{
// try to start with technical user credentials
try
{
var processStartInfo = new ProcessStartInfo
{
UseShellExecute = false,
FileName = programPath,
Arguments = arguments,
UserName = userName,
Password = userPassword,
Domain = userDomain,
WorkingDirectory = workingDirectory,
};
return Process.Start(processStartInfo);
}
catch (Exception exception)
{
// Log error and continue with default UAC method
}
}
// try elevation using UAC
{
var processStartInfo = new ProcessStartInfo
{
UseShellExecute = true,
FileName = programPath,
Arguments = arguments,
Verb = "runas",
WorkingDirectory = workingDirectory,
};
return Process.Start(processStartInfo);
}
}
当运行此代码时,非特权用户会收到错误(来自第一个catch
- 子句):
System.ComponentModel.Win32Exception (0x80004005): the requested operation requires elevated privileges*
*)从本地化的错误消息翻译过来(我讨厌这个!)
我认为是由于切换到合适的用户,但未能提升到管理员环境。我希望指定一个正确的清单使Windows启动UAC以请求确认用户的提升。
根据我的搜索结果,大多数热门歌曲都是关于人们试图完全绕过UAC。这不是不是我的目标。用户可能仍会收到提升请求,但不会要求提供任何凭据。
进一步调查
我用regedit.exe
作为目标测试了我的启动器。 regedit.exe
具有以下清单,并允许普通用户启动它:
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
在我的启动器中使用用户开关时,尽管用户在&#34;管理员&#34;中,但启动失败(无特权)组。当我以特权用户手动启动regedit.exe
时,我必须确认UAC。
与calc.exe
相同的测试(不需要特殊权限)可以正常工作。结论:
我开始相信用户和无法在一次通话中通过UAC提升权限。但我没有看到为什么这是不可能或禁止的。