我试了一下有些文章上的说法,大多都是在98下进行的,到了xp 下时就不灵了,请高手帮忙

解决方案 »

  1.   

    你确定都仔细看了?还别说用google,在CSDN,类似问题都出现过成千上万遍。说实在的,很多问题,有个MSDN可以查,都没必要问了。
      

  2.   

    要源程序?我有,其实楼上大侠说的很对,抽空给你,请留Email;
      

  3.   

    procedure TFrm_regedit.GetPrivilege;
    var
      NewState:       TTokenPrivileges;
      lpLuid:         Int64;
      ReturnLength:   DWord;
      ToKenHandle:    Cardinal;
    begin
      OpenProcessToken(GetCurrentProcess,
                       TOKEN_ADJUST_PRIVILEGES
                       OR TOKEN_ALL_ACCESS
                       OR STANDARD_RIGHTS_REQUIRED
                       OR TOKEN_QUERY,ToKenHandle);
      LookupPrivilegeValue(nil,'SeShutdownPrivilege',lpLuid);
      NewState.PrivilegeCount:=1;
      NewState.Privileges[0].Luid:=lpLuid;
      NewState.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
      ReturnLength:=0;
      AdjustTokenPrivileges(ToKenHandle,False,NewState,0,nil,ReturnLength);
    end;
      

  4.   

    procedure ShutDownSystem;
    var
        hProcess, hAccessToken: THandle;
        LUID_AND_ATTRIBUTES: TLUIDAndAttributes;
        TOKEN_PRIVILEGES: TTokenPrivileges;
        BufferIsNull: DWord;
    const
        SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    begin
        //VER_PLATFORM_WIN32s = 0;
        //VER_PLATFORM_WIN32_WINDOWS = 1;
        //VER_PLATFORM_WIN32_NT = 2;
        if Win32PlatForm = VER_PLATFORM_WIN32_NT then
        begin //WindowsNT
            hProcess := GetCurrentProcess;
            OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hAccessToken);
            LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, LUID_AND_ATTRIBUTES.Luid);
            LUID_AND_ATTRIBUTES.Attributes := SE_PRIVILEGE_ENABLED;
            TOKEN_PRIVILEGES.PrivilegeCount := 1;
            TOKEN_PRIVILEGES.Privileges[0] := LUID_AND_ATTRIBUTES;
            BufferIsNull := 0;
            AdjustTokenPrivileges(hAccessToken, False, TOKEN_PRIVILEGES, sizeof(TOKEN_PRIVILEGES), nil, BufferIsNull);
        end;
        ExitWindowsEx(EWX_POWEROFF, 0);
    end;