经典的截屏程序片断,正常情况没问题的。但我的程序是通过系统服务间接启动的(ShellExecute()),
这时程序显示为 SYSTEM,而不是Administrator所有。截屏却是白色的,不再是当前桌面上的彩色图像。
求解!

解决方案 »

  1.   

    原以为DELPHI栏目高手多。却无人问津
      

  2.   

    用户提权嘛,不然得到的路径都是错的,type
      _TOKEN_TYPE = (TokenTypePad0, TokenPrimary, TokenImpersonation);
      TOKEN_TYPE = _TOKEN_TYPE;
      PTOKEN_TYPE = ^TOKEN_TYPE;
      TTokenType = TOKEN_TYPE;
      PTokenType = PTOKEN_TYPE;  _SECURITY_IMPERSONATION_LEVEL = (SecurityAnonymous, SecurityIdentification,
        SecurityImpersonation, SecurityDelegation);
      SECURITY_IMPERSONATION_LEVEL = _SECURITY_IMPERSONATION_LEVEL;
      PSECURITY_IMPERSONATION_LEVEL = ^SECURITY_IMPERSONATION_LEVEL;
      TSecurityImpersonationLevel = SECURITY_IMPERSONATION_LEVEL;
      PSecurityImpersonationLevel = PSECURITY_IMPERSONATION_LEVEL;
    function SessionLogon():Boolean;
    var
      dwSessionId: DWORD;
      FhToken: HANDLE ;
      FhTokenDup: HANDLE ;
    begin
      Result:=False;
      dwSessionId := lpWTSGetActiveConsoleSessionId();

      if(lpWTSQueryUserToken(dwSessionId, FhToken))then
      begin
        if(lpDuplicateTokenEx (FhToken, MAXIMUM_ALLOWED, nil, SecurityIdentification, TokenPrimary, FhTokenDup))then
        begin
          if(lpImpersonateLoggedOnUser (FhTokenDup))then
          begin
    Result := TRUE;
          end
        end
      end;
    end;在你启动时调用,或者将要调用截屏功能函数时调用,结束时lpRevertToSelf,
    相关函数的定义请查找jedi文件就行了,或者在网上找
      

  3.   

    不同会话有不同的环境变量,也就是说不同用户会有不同的用户路径,桌面,证书库等等,
    那段代码就是先复制当前的活动会话的用户令牌,也就是admin的令牌,
    再调用ImpersonateLoggedOnUser来使system用户暂时模拟admin用户,
    实际上ImpersonateLoggedOnUser是在很多远程控制程序或者黑客程序都是用来提权的关键API。
      

  4.   

    http://topic.csdn.net/t/20061116/13/5162746.html
    这个贴子才是成功的希望!
      

  5.   

    应该是截图代码有问题吧,Administrator都有权限,SYSTEM肯定不会有问题。LZ把截图代码贴出来吧
      

  6.   

    void    setDesktop()
    {
            HWINSTA  hwinsta=OpenWindowStation("WINSTA0",false,MAXIMUM_ALLOWED);
            SetProcessWindowStation(hwinsta);
            HDESK  hdesk=OpenDesktop("DEFAULT",0,false,MAXIMUM_ALLOWED);
            SetThreadDesktop(hdesk);
    }
    bool    SaveDesktop(TStream *fs,int q)
    {                    // 保存桌面到文件中
            bool result=true;
            setDesktop();        //  新增的
            RECT   r;
            HWND d0=GetDesktopWindow();
            GetWindowRect(d0,&r);
            TCanvas *Canvas0=new TCanvas;
            Canvas0->Handle=GetDC(d0);
            Graphics::TBitmap *b=new Graphics::TBitmap();
            b->Height=r.bottom;
            b->Width=r.right;
            b->Canvas->CopyRect(r,Canvas0,r);
            TJPEGImage *j=new TJPEGImage();
            j->CompressionQuality=q; // 图象质量 1-100
            j->Assign(b);
            try
              {
                j->SaveToStream(fs);
              }
            catch(...)
              {
                result=false;   
              }
            delete j;
            delete b;
            delete Canvas0;
            return(result);
    }
    就是不成
      

  7.   

    呵呵。已经解决!!!!!!!!!!!!!!!!!
    昨天试了一天,未成,今上午莫名其妙成了!也没改源程序,可能机器重启了,
    可能与卸了一次服务有关。截屏一下成功了!我竟然不相信自已的眼睛了。
    为了使后面的人不重复我的费事过程,把源码贴出,积德呀:)。
    void setDesktop() // 切换到用户桌面
    {
      char pvInfo[128]= { 0 };
      DWORD dwLen=0;
      HDESK hActiveDesktop=OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK,false,MAXIMUM_ALLOWED);
      GetUserObjectInformation(hActiveDesktop,UOI_NAME,pvInfo,sizeof(pvInfo),&dwLen);
      CloseDesktop(hActiveDesktop);
      HWINSTA m_hwinsta=OpenWindowStation("WINSTA0",false,MAXIMUM_ALLOWED);
      SetProcessWindowStation(m_hwinsta);
      HDESK m_hdesk=OpenDesktop(pvInfo,0,false,MAXIMUM_ALLOWED);
      SetThreadDesktop(m_hdesk);
    }
    void SaveDesktop(TStream *fs,int q) // 保存桌面jpg到流中 图象质量q%
    {
      setDesktop(); // 切换到用户桌面
      RECT r;
      HWND d0=GetDesktopWindow();
      GetWindowRect(d0,&r);
      TCanvas *Canvas0=new TCanvas;
      Canvas0->Handle=GetDC(d0);  Graphics::TBitmap *b=new Graphics::TBitmap();
      b->Height=r.bottom;
      b->Width=r.right;
      b->Canvas->CopyRect(r,Canvas0,r);  TJPEGImage *j=new TJPEGImage();
      j->CompressionQuality=q; // 图象质量 1-100%
      j->Assign(b);
      try
      {
      j->SaveToStream(fs);
      }
      catch(...)
      {
      }
      delete j;
      delete b;
      delete Canvas0;
    }
    就这么一点点长,费了我一个星期,搜的许多旧贴子,许多人遇到同样的苦恼。