Vista的 UAC真的很烦很烦!我要做的是在Vista下建立一个service然后用这个service建立一个新的进程并要求这个进程必须有管理员权限,当然前提是我知道用户名和密码。我的实现方法是             // execute install file 
   HANDLE    hToken;
   LPVOID    lpvEnv;
   PROCESS_INFORMATION pi = {0};
   STARTUPINFO         si = {0};    si.cb = sizeof(STARTUPINFO);    //
   // TO DO: change NULL to '.' to use local account database
   //
   if (!LogonUser(L"administrator@domain", NULL, L"psw",LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT, &hToken))
   {
   DWORD dwErrCode = GetLastError();
   WCHAR wstrErrCode[16];
   memset(wstrErrCode,0,sizeof(wstrErrCode));
   wsprintf(wstrErrCode,L"%d",dwErrCode);
   MessageBox(NULL,wstrErrCode,L"Logon User Failed!",MB_OK|MB_ICONINFORMATION);
   }
   if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
   {
   DWORD dwErrCode = GetLastError();
   WCHAR wstrErrCode[16];
   memset(wstrErrCode,0,sizeof(wstrErrCode));
   wsprintf(wstrErrCode,L"%d",dwErrCode);
   MessageBox(NULL,wstrErrCode,L"Create Environment Block Failed!",MB_OK|MB_ICONINFORMATION);
   }
   //
   // TO DO: change NULL to '.' to use local account database
   //
   if (!CreateProcessWithLogonW(
   L"administrator@domain", 
   NULL, 
   L"psw", 
   LOGON_WITH_PROFILE, 
   NULL, 
   L"all command-line", 
   CREATE_UNICODE_ENVIRONMENT, 
   lpvEnv, 
   NULL,
   &si, 
   &pi))
   {
   DWORD dwErrCode = GetLastError();
   WCHAR wstrErrCode[16];
   memset(wstrErrCode,0,sizeof(wstrErrCode));
   wsprintf(wstrErrCode,L"%d",dwErrCode);
   MessageBox(NULL,wstrErrCode,L"Create Process Failed!",MB_OK|MB_ICONINFORMATION);
   }    if (!DestroyEnvironmentBlock(lpvEnv))
   {
   DWORD dwErrCode = GetLastError();
   WCHAR wstrErrCode[16];
   memset(wstrErrCode,0,sizeof(wstrErrCode));
   wsprintf(wstrErrCode,L"%d",dwErrCode);
   MessageBox(NULL,wstrErrCode,L"Destroy Environment Block Failed!",MB_OK|MB_ICONINFORMATION);
   }    CloseHandle(hToken);
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);这段code单独放在一个问win32的console里,工作的很好,但是把它加到service的执行部分时,CreateProcessWithLogonW()总是得到“Access is denied”的error code。 那位高人知道是怎么回事,怎么解决呢?谢谢!

解决方案 »

  1.   

    我之前试过用Service加载程序,直接CreateProcess就可以有管理员权限,但被加载的进程不能有UI,如果显示UI会在另一个桌面,想了很多办法也没解决。XP下是可以。
      

  2.   

    xp下是没有问题啊,用createprocess和 shellexec 都行 , 可恨的vista , UI显示在另一个桌面应该是 session的问题 还好 我这个没有UI, 估计还是个权限的问题, 烦啊
      

  3.   

    首先要切换session才能创建窗口进程。vista下服务位于session 0,用户桌面位于session 1,这点跟以前的操作系统版本是不同的。
    这个帖子里面有代码供你参考
      

  4.   

    谢谢啦 我也估计可能是sesion的问题 我去试试 问题解决马上回来加分