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

.net 绕过Windows Server 2008中的会话0隔离--成功,但仍然不可见,.net,windows-server-2008,session-0-isolation,.net,Windows Server 2008,Session 0 Isolation,我使用的代码位于基本上是开始一个进程。这段代码在Vista/7中工作正常——如果我使用System.Diagnostics.process.start()启动一个进程,我会看到它启动了,但不可见,因为它位于会话0中。使用此代码,我看到进程在会话1中启动(与我在Vista/7中手动启动程序的会话相同) 现在,在Server2008中,当我手动启动一个程序时,它将打开到会话2。当我不使用此代码时,我看到进程仍会启动到会话0。当我使用这段代码时,它开始于会话1,但不可见。这大概是因为它不是在与我相同的

我使用的代码位于基本上是开始一个进程。这段代码在Vista/7中工作正常——如果我使用
System.Diagnostics.process.start()
启动一个进程,我会看到它启动了,但不可见,因为它位于会话0中。使用此代码,我看到进程在会话1中启动(与我在Vista/7中手动启动程序的会话相同)

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


以前有人遇到过这个问题吗?这个博客似乎比较受欢迎,所以我很难相信这个问题还没有得到解决。我正在使用的服务器是64位体系结构,我的Win7机器是32位的。不过,我不认为这有什么区别,博客指出该解决方案在两种体系结构上都有效。

如果您试图通过远程桌面绕过UAC,则需要使用ID覆盖。这是因为Microsoft API方法
WTSGetActiveConsoleSessionId
在使用远程桌面时无法提供正确的信息:

连接到物理控制台的会话的会话标识符

因此,要绕过Vista/Win7/2k8 UAC,您只需使用基本的Ping功能——它将在本地系统下启动进程,并使用用户可见的正确SID

如果您注意到没有发生这种情况,可以进入process manager,检查SID,并使用ping w/
userIDOverride
指定正确的SID

专用静态只读ILog记录器
=LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
String applicationName=String.Empty;
布尔结果;
公共访问()
{
Debug(“我现在在Access构造函数中”);
}
公共无效Ping(字符串地址)
{
Debug(“我现在在Ping”);
applicationName=@“C:\Windows\System32\ping.exe”+地址+“-t”;
Debug(String.Format(“应用程序名:{0}”,applicationName));
ApplicationLoader.PROCESS\u信息procInfo;
结果=ApplicationLoader.StartProcess和BypassUAC(
应用程序名称,
在procInfo,
无效);
Logger.Debug(String.Format(
“StartProcessAndBypassUAC的结果:{0}”,Result.ToString());
}
公共无效Ping(字符串地址,int userIDOverride)
{
Debug(“我现在使用Ping w/override”);
applicationName=@“C:\Windows\System32\ping.exe”+地址+“-t”;
Debug(String.Format(“应用程序名:{0}”,applicationName));
ApplicationLoader.PROCESS\u信息procInfo;
结果=ApplicationLoader.StartProcess和BypassUAC(
应用程序名称,
在procInfo,
userIDOverride);
Logger.Debug(String.Format(
“StartProcessAndBypassUAC的结果:{0}”,Result.ToString());
}