如果您尝试通过远程桌面绕过 UAC,则需要使用 ID 覆盖。这是因为 Microsoft API 方法WTSGetActiveConsoleSessionId
在使用远程桌面时无法提供正确的信息:
附加到物理控制台的会话的会话标识符。
因此,要绕过 Vista/Win7/2k8 UAC,您可以只使用基本的 Ping 功能——它将在 LOCAL SYSTEM 下启动进程,并使用正确的 SID 对用户可见。
如果您发现这没有发生,您可以进入流程管理器,检查 SID,然后使用 ping w/userIDOverride
来指定正确的 SID。
private static readonly ILog Logger
= LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
String applicationName = String.Empty;
bool result;
public Access()
{
Logger.Debug("I am now in Access Constructor");
}
public void Ping(string address)
{
Logger.Debug("I am now in Ping");
applicationName = @"C:\Windows\System32\ping.exe " + address + " -t";
Logger.Debug(String.Format("Application Name: {0} ", applicationName));
ApplicationLoader.PROCESS_INFORMATION procInfo;
result = ApplicationLoader.StartProcessAndBypassUAC(
applicationName,
out procInfo,
null);
Logger.Debug(String.Format(
"Result of StartProcessAndBypassUAC: {0} ", result.ToString()));
}
public void Ping(string address, int userIDOverride)
{
Logger.Debug("I am now in Ping w/ override");
applicationName = @"C:\Windows\System32\ping.exe " + address + " -t";
Logger.Debug(String.Format("Application Name: {0} ", applicationName));
ApplicationLoader.PROCESS_INFORMATION procInfo;
result = ApplicationLoader.StartProcessAndBypassUAC(
applicationName,
out procInfo,
userIDOverride);
Logger.Debug(String.Format(
"Result of StartProcessAndBypassUAC: {0} ", result.ToString()));
}