本帖最后由 haochin 于 2010-02-04 10:53:08 编辑

解决方案 »

  1.   


     procedure   TForm1.Button2Click(Sender:   TObject);   
      var   
          VerInfo:TOSVersionInfo;   
          hToken:THANDLE;   
          tkp:TOKEN_PRIVILEGES;   
          Nothing:Cardinal;   
      begin   
          VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);   
          GetVersionEx(VerInfo);   
          if   VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT   then   
          Begin   
              OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES   or   TOKEN_QUERY,hToken);   
              LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);   
              tkp.PrivilegeCount:=   1;   
              tkp.Privileges[0].Attributes:=   SE_PRIVILEGE_ENABLED;   
              AdjustTokenPrivileges(hToken,   FALSE,   tkp,   0,nil,   Nothing);   
          End;   
              ExitWindowsEx(EWX_POWEROFF,0);//关机   
      end;
    试试这个............
      

  2.   

    var
      hToken:THANDLE;
      tkp:TTokenPrivileges;
      Rl:Dword;
    begin
      if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
      begin
       LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
       tkp.PrivilegeCount:= 1;
       tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
       AdjustTokenPrivileges(hToken,FALSE,tkp,SizeOf(tkp),tkp,Rl);
       ExitWindowsEx(EWX_SHUTDOWN, 0); //关机
      end;
    end;
      

  3.   

    //我写的这个delphi 7,xp下通过
      

  4.   

    你要获得SeShutdownPrivilege的特权才能关机
      

  5.   

    关机。注销。重启 都需要特权才能。也就是还要提权。我的blog上有这个代码。无窗体有窗体的都有。这个问题简单。装会高手。。
      

  6.   

    调试看哪一步失败,错误码是什么。
    另外,ExitWindowsEx的第2参数最好不要给0,参考MSDN中的说明。
      

  7.   

    你好,你的问题是虽然调用了api,但是由于无系统操作权限引起的api执行错误。请在unit中加入xp的提权代码。回答完毕(绝对正确)
      

  8.   

    我一直在用d7+ xp,win7都能正常关机Irc_Reboot_Shutdown(2);//关闭计算机//关机函数
    function Irc_Reboot_Shutdown(i:integer):boolean;
    var
    hToken :THandle; 
    tkp : TOKEN_PRIVILEGES; 
    ReturnLength : DWord;
    begin 
    RESULT:=false;
    if (not OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES
    or TOKEN_ALL_ACCESS 
    or TOKEN_QUERY, hToken)) 
    then 
    RESULT:=false; 
    LookupPrivilegevalue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); 
    tkp.PrivilegeCount := 1; 
    tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED; 
    ReturnLength :=0;
    AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength);if (GetLastError() <> ERROR_SUCCESS) then
    RESULT:=false; 
    case i of 
    1: begin 
    ExitWindowsEx(EWX_REBOOT, 0); //reboot 
    RESULT:=true; 
    end; 
    2: begin 
    ExitWindowsEx(EWX_SHUTDOWN+EWX_POWEROFF, 0); //shutdown   //关闭计算机
    RESULT:=true; 
    end; 
    3: begin 
    ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN, 0); //force shutdown 
    RESULT:=true; 
    end; 
    4: begin 
    ExitWindowsEx(EWX_LOGOFF, 0); //logoff 
    RESULT:=true; 
    end; 
    end;
    end;
      

  9.   

    1,绝对不是权限的问题。我自己用的电脑都是administrator用户。
    2,编译时不报错,直接就是不运行程序。。并不是运行了不能关机。
      

  10.   

    admin权限和debug,关机权限不是一回事,楼主查下资料就明白了,不要不懂装懂,容易贻笑大方的
      

  11.   

    把防火墙什么的都关掉,360有可能会阻止关机过程,因为exitwindowex可以杀360进程