3

我基本上按原样使用位于此处的代码来启动一个进程。此代码在 Vista/7 中完美运行——如果我使用启动一个进程,System.Diagnostics.Process.Start()我看到它启动了,但由于它位于会话 0 中而不可见。使用此代码,我看到进程在会话 1 中启动(同一个会话我在 Vista/7 中手动启动程序)。

现在,在 Server 2008 中,当我手动启动程序时,它会打开会话 2。当我不使用此代码时,我看到进程仍会启动会话 0。当我使用此代码时,它会启动会话 1 --但不可见。大概这是因为它没有在与我相同的会话中启动,因此存在于其他地方的“不可见”桌面上。

有没有人遇到过这个问题?该博客似乎比较受欢迎,所以我很难相信这个问题还没有得到解决。我正在使用的服务器是 64 位架构的,我的 win 7 机器是 32 位的。我不认为这有什么不同,博客表明该解决方案适用于两种架构。

4

1 回答 1

1

如果您尝试通过远程桌面绕过 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()));
}
于 2013-10-08T16:16:12.177 回答