#include <windows.h>
#include <stdio.h>
#pragma hdrstopvoid main()
{
 HANDLE hToken;
 LUID setcbnameValue;
 TOKEN_PRIVILEGES tkp;
 DWORD errcod;
 LPVOID lpMsgBuf;
 LPCTSTR msgptr; UCHAR InfoBuffer[1000];
 PTOKEN_PRIVILEGES ptgPrivileges = (PTOKEN_PRIVILEGES) InfoBuffer;
 DWORD dwInfoBufferSize;
 DWORD dwPrivilegeNameSize;
 DWORD dwDisplayNameSize; 
 UCHAR ucPrivilegeName[500];
 UCHAR ucDisplayName[500];
 DWORD  dwLangId;
 UINT i; if ( ! OpenProcessToken( GetCurrentProcess(),
  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
 {
  puts( "OpenProcessToken" );
  return;
 } // ---------------------------------------------------------------------
 // enumerate currently held privs (NOTE: not *enabled* privs, just the
 // ones you _could_ enable as in the last part) GetTokenInformation( hToken, TokenPrivileges, InfoBuffer,
  sizeof InfoBuffer, &dwInfoBufferSize); printf( "Account privileges: \n\n" );
 for( i = 0; i < ptgPrivileges->PrivilegeCount; i ++ )
 {
  dwPrivilegeNameSize = sizeof ucPrivilegeName;
  dwDisplayNameSize = sizeof ucDisplayName;
  LookupPrivilegeName( NULL, &ptgPrivileges->Privileges[i].Luid,
   ucPrivilegeName, &dwPrivilegeNameSize );
  LookupPrivilegeDisplayName( NULL, ucPrivilegeName,
   ucDisplayName, &dwDisplayNameSize, &dwLangId );
  printf( "%40s (%s)\n", ucDisplayName, ucPrivilegeName );
 }} 
 

解决方案 »

  1.   

    為了簡單起見,我寫在一個button.click中,加了個memo1顯示,你可自己修改!
    procedure TForm1.Button1Click(Sender: TObject);
    var
      hToken: Cardinal;
      ptgPrivileges: PTokenPrivileges;
      dwInfoBufferSize: DWORD;
      dwPrivilegeNameSize: DWORD;
      dwDisplayNameSize: DWORD;
      ucPrivilegeName: array[0..1000] of char;
      ucDisplayName: array[0..1000] of char;
      dwLangId: DWORD;
      i: Cardinal;
    begin
      if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
        or TOKEN_QUERY, hToken) then
      begin
        raise Exception.Create('can''t open processtoke');
        exit;
      end;  GetMem(ptgPrivileges, SizeOf(char) * 1000);
      GetTokenInformation(hToken, TokenPrivileges, ptgPrivileges,
        sizeof(char)* 1000, dwInfoBufferSize);    Memo1.Lines.Add('Account privileges: ' + IntToStr(ptgPrivileges^.PrivilegeCount));
       //printf( "Account privileges: \n\n" );  for i := 0 to ptgPrivileges^.PrivilegeCount do
      begin
        dwPrivilegeNameSize := sizeof(ucPrivilegeName);
        dwDisplayNameSize := sizeof(ucDisplayName);
        LookupPrivilegeName(nil, ptgPrivileges^.Privileges[i].Luid,
          ucPrivilegeName, dwPrivilegeNameSize);
        LookupPrivilegeDisplayName(nil, ucPrivilegeName,
          ucDisplayName, dwDisplayNameSize, dwLangId);
          Memo1.Lines.Add(ucDisplayName + ' -- '  + ucPrivilegeName);
      //printf( "%40s (%s)\n", ucDisplayName, ucPrivilegeName );
      end;
      FreeMem(ptgPrivileges);
    end;
      

  2.   

    還有,你的C++代碼有點小問題,我修改了一下,在Win2K+VC6++編繹成功如下:
    int main(int argc, char* argv[])
    {
     HANDLE hToken;
     UCHAR InfoBuffer[1000];
     PTOKEN_PRIVILEGES ptgPrivileges = (PTOKEN_PRIVILEGES) InfoBuffer;
     DWORD dwInfoBufferSize;
     DWORD dwPrivilegeNameSize;
     DWORD dwDisplayNameSize; 
     CHAR ucPrivilegeName[500];
     CHAR ucDisplayName[500];
     DWORD  dwLangId;
     UINT i; if ( ! OpenProcessToken( GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
     {
      puts( "OpenProcessToken" );
      return 0;
     } // ---------------------------------------------------------------------
     // enumerate currently held privs (NOTE: not *enabled* privs, just the
     // ones you _could_ enable as in the last part) GetTokenInformation( hToken, TokenPrivileges, InfoBuffer,
      sizeof InfoBuffer, &dwInfoBufferSize); printf( "Account privileges Total is %d: \n\n", ptgPrivileges->PrivilegeCount );
     for( i = 0; i < ptgPrivileges->PrivilegeCount; i ++ )
     {
      printf("current i is %d\n",i);
      dwPrivilegeNameSize = sizeof ucPrivilegeName;
      dwDisplayNameSize = sizeof ucDisplayName;
      
      LookupPrivilegeName( NULL, &ptgPrivileges->Privileges[i].Luid,
       (char *)ucPrivilegeName, &dwPrivilegeNameSize );
      
      LookupPrivilegeDisplayName( NULL, (char *)ucPrivilegeName,
       (char *)ucDisplayName, &dwDisplayNameSize, &dwLangId );
      
     // printf("ucPrivilegeName: %s\n",ucPrivilegeName);
     // printf("ucPrivilegeName: %s\n", ucPrivilegeName);
      printf( "Cur I: %d; %40s (%s)\n", i, ucDisplayName, ucPrivilegeName);
     }
      return 0;
    }
      

  3.   

    哇~Very Very Thanks .还有一点小问题,使用上面的程序,我发现超级用户(administrator)和系统用户(SYSTEM)并没有得到所有的权限,这样会不会导致有些以SYSTEM上下文运行的程序不能正常执行呢?
      

  4.   

    當然會,一般,在Xp,2k下,如果你要處理一些系統操作,還要動態取得相應的權限!
      

  5.   

    我看到的一些资料上说给超级用户(administrator)增加权限后一般都要注销并重新登陆.
    那么如果想给系统用户(System)增加权限,应该怎么做呢,系统用户在所有用户还未登陆的时候就已经存在了呀。