绕过Windows Server 2008中的会话0隔离 - 成功但仍然不可见

时间:2011-04-04 14:43:46

标签: .net windows-server-2008 session-0-isolation

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

现在,在Server 2008中,当我手动启动程序时,它会打开到会话2.当我不使用此代码时,我看到该过程仍然开始进入会话0.当我使用此代码时,它开始进入会话1 - 但不可见。据推测,这是因为它不是在与我相同的会话中启动,因此存在于其他地方的“隐形”桌面上。

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

1 个答案:

答案 0 :(得分: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()));
}
相关问题