从服务启动的交互式窗口上的黑色背景

时间:2011-09-21 18:24:33

标签: c# .net windows winapi

我正在用C#实现Windows服务。此服务调用启动交互式窗口的单独应用程序。通过使用以下一系列步骤,我已经能够解决Session 0 Isolation带来的问题:

  1. LogonUser()获取将执行单独应用程序的用户的登录令牌
  2. SetTokenInformation()将用户的登录令牌转移到会话1
  3. CreateProcessAsUser()在用户会话中启动应用程序。
  4. 这有效;当服务启动应用程序时,我看到应用程序的窗口出现在我的控制台会话中。但是,应用程序的窗口具有黑色背景,并且所有控件都是不可见的。如果我点击我知道有一个按钮的区域,窗口会响应,所以它显然能够接收用户输入。

    这是我正在使用的代码(简化版本和简化版本):

    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隔离的问题,但两种情况下的症状似乎相似。

0 个答案:

没有答案