我正在用C#实现Windows服务。此服务调用启动交互式窗口的单独应用程序。通过使用以下一系列步骤,我已经能够解决Session 0 Isolation带来的问题:
这有效;当服务启动应用程序时,我看到应用程序的窗口出现在我的控制台会话中。但是,应用程序的窗口具有黑色背景,并且所有控件都是不可见的。如果我点击我知道有一个按钮的区域,窗口会响应,所以它显然能够接收用户输入。
这是我正在使用的代码(简化版本和简化版本):
IntPtr logonToken;
LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out logonToken);
SetTokenInformation(logonToken, TOKEN_INFORMATION_CLASS.TokenSessionId, sessionIdValuePtr, sessionIdSize);
STARTUPINFO startupinfo = new STARTUPINFO();
startupinfo.cb = Marshal.SizeOf(startupinfo);
startupinfo.lpDesktop = @"winsta0\default";
PROCESS_INFORMATION processinfo;
SECURITY_ATTRIBUTES processAttributes = new SECURITY_ATTRIBUTES();
SECURITY_ATTRIBUTES threadAttributes = new SECURITY_ATTRIBUTES();
ImpersonateLoggedOnUser(logonToken);
CreateProcessAsUser(
logonToken,
null,
cmdLine,
ref processAttributes,
ref threadAttributes,
false,
0,
IntPtr.Zero,
workingDirectory,
ref startupinfo,
out processinfo)
RevertToSelf();
我尝试在调用CreateProcessAsUser之前添加代码来加载用户的配置文件,但这没有帮助。
什么可能导致我的窗户上的黑色背景,我应该如何解决这个问题?任何帮助都将非常感激。
更新:这似乎与此问题中的问题非常相似:CreateProcessAsUser doesn't draw the GUI。他正在使用XP SP3,我在Windows 7和Server 2008中遇到了这个问题,这意味着我还有处理Session 0隔离的问题,但两种情况下的症状似乎相似。