2000下必须有Administrator权限(偶是看书上说的)

解决方案 »

  1.   

    你需要调用AdjustTokenPrivileges函数给当前进程授权:
    procedure AdjustToken;
      Const TOKEN_ADJUST_PRIVILEGES = $20;
      TOKEN_QUERY = $8;
      SE_PRIVILEGE_ENABLED = $2;
    var
      hdlProcessHandle,hdlTokenHandle:THandle;
      tmpLuid :TLargeInteger;
      tkp :TTOKENPRIVILEGES;
      lBufferNeeded : DWord;
    begin
      SetLastError(0);
      hdlProcessHandle := GetCurrentProcess();
      OpenProcessToken(hdlProcessHandle,
                (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle);
      LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Luid := tmpLuid;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      AdjustTokenPrivileges(hdlTokenHandle,
                                   False,
                                   tkp,
                                   0,
                                   nil,
                                   lBufferNeeded);end;
    解决了的话,记得给俺分哟。
      

  2.   

    我是在Administrator权限下执行的程序啊
      

  3.   

    书上说,对于Windows NT(2000就是NT5.0),参数为0(LOGOFF)不需特权.
    参数为1(shutdown),2(REboot)需要SE_SHUTDOWN_NAME特权.
    不知道实际怎样.没有试过
      

  4.   

    unionsoftzboy(unionsoftzboy)  的方法我试了,不需要直接关掉机器电源
      

  5.   

    希望:unionsoftzboy(unionsoftzboy)帮我解决能够关掉电源的问题