RT,一个已经被实现的想法.
程序运行在SYSTEM权限下(后台服务),在系统未登陆前(用户级别的explorer.exe还没有启动).这个时候,如果启动一个system权限的explorer.exe, 是否有机会跳过登陆验证?又应该在哪个会话里, 我能看到这个explorer启动带来的桌面呢? Winlogon OR Default?

解决方案 »

  1.   

    explorer.exe不会导致登录认证的。而且explorer也不会导致新生成桌面。创建桌面是用CreateDesktop,创建成功后,然后在该桌面启动一个explorer进程,然后SwitchDesktop切过去
      

  2.   

    BOOL SetupVitualDesktop(HDESK hvirtualDesk,HDESK hOldDesk,int BCreateNewDesktop,DWORD *epid)
    {
    if(BCreateNewDesktop)
    {
    //Security  
    SECURITY_ATTRIBUTES sa;  
    sa.bInheritHandle = true;  
    sa.lpSecurityDescriptor=NULL;  
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);   hvirtualDesk=CreateDesktop("newvitualdesk",NULL,NULL,DF_ALLOWOTHERACCOUNTHOOK,DESKTOP_CREATEMENU|DESKTOP_CREATEWINDOW|DESKTOP_READOBJECTS|DESKTOP_SWITCHDESKTOP|DESKTOP_WRITEOBJECTS,&sa); if(hvirtualDesk)
    {
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    TCHAR ExplorerPath[MAX_PATH]={0};
    GetWindowsDirectory(ExplorerPath,MAX_PATH);
    strcat(ExplorerPath,"\\explorer.exe");

    ZeroMemory( &si, sizeof(si) );
    ZeroMemory( &pi, sizeof(pi) ); 
    si.cb = sizeof(si); 
    si.lpDesktop="newvitualdesk"; 
    si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_SHOW; if (!CreateProcess(NULL,ExplorerPath,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
    {
    *epid=0;
    OutputString("CreateProcess %s %d",ExplorerPath,GetLastError());
    return FALSE;
    } Sleep(3000);
                OutputString("CreateProcess %s %d",ExplorerPath,pi.dwProcessId);
    *epid=pi.dwProcessId;

    SwitchDesktop(hvirtualDesk);   
    return TRUE;
    }
    }
    else
    {
    if(*epid)
    BPskill(*epid);
    SwitchDesktop(hOldDesk);
    CloseDesktop(hOldDesk); 
    CloseDesktop(hvirtualDesk); 
    return TRUE;
    }
    return FALSE;
    }
    以上是我的代码, 在服务程序里, 在系统登陆的界面,通过远程网络调用.
    奇怪的是只能切换到另外一个桌面,但是并不能看到explorer启动带来的桌面.