ExitWindowsEx在NT/2000系统要有系统管理员的权限:
{*******************************************************************************
    Name:AdjustProcess
    Description:开放权限
    Argument:无
    Result:无
*******************************************************************************}
procedure TfrmMain.AdjustProcess;
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   //NT系统设置权限
    Begin
        OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
        LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
        //LookupPrivilegeValue(nil,'SePowerOffPrivilege',tkp.Privileges[0].Luid);
        tkp.PrivilegeCount:= 1;
        tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
    end;
end;
关机函数:        Win32Check(ExitWindowsEx(EWX_POWEROFF,0));
判断系统版本:GetVersionEx(VerInfo);   //获取当然操作系统信息

解决方案 »

  1.   

    关于你的第二个问题:
    {$IFDEF WIN32}
    function GetVersionEx(lpOs : pointer) : BOOL; stdcall;
     external 'kernel32' name 'GetVersionExA';
    {$ENDIF}procedure GetWindowsVersion(var Major : integer;
                                var Minor : integer);
    var
     {$IFDEF WIN32}
      lpOS, lpOS2 : POsVersionInfo;
     {$ELSE}
      l : longint;
     {$ENDIF}
    begin
     {$IFDEF WIN32}
       GetMem(lpOS, SizeOf(TOsVersionInfo));
       lpOs^.dwOSVersionInfoSize := SizeOf(TOsVersionInfo);
       while getVersionEx(lpOS) = false do begin
         GetMem(lpos2, lpos^.dwOSVersionInfoSize + 1);
         lpOs2^.dwOSVersionInfoSize := lpOs^.dwOSVersionInfoSize + 1;
         FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
         lpOS := lpOs2;
       end;
       Major := lpOs^.dwMajorVersion;
       Minor := lpOs^.dwMinorVersion;
       FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
     {$ELSE}
      l := GetVersion;
      Major := LoByte(LoWord(l));
      Minor := HiByte(LoWord(l));
     {$ENDIF}
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      Major : integer;
      Minor : integer;
    begin
      GetWindowsVersion(Major, Minor);
      Memo1.Lines.Add(IntToStr(Major));
      Memo1.Lines.Add(IntToStr(Minor));
    end;--------------------------------------------------------------------------------
      if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
        ShowMessage('win9x');
      if Win32Platform = VER_PLATFORM_WIN32_NT then
        ShowMessage('winNT');--------------------------------------------------------------------------------
    procedure TForm1.Button1Click(Sender: TObject);
    var
    OS : TOSVersionInfo;
    begin
    OS.dwOSVersionInfoSize := sizeof(OS);
    GetVersionEx(OS);
    with OS do
        case dwPlatformId of
            VER_PLATFORM_WIN32s :
                  label1.caption := 'Windows 3.1x/32s';
            VER_PLATFORM_WIN32_WINDOWS :
                Begin
                    if (dwMajorVersion = 4) and (dwMinorVersion > 0) then
                    label1.caption := 'Windows 98'
                  else
                    label1.caption := 'Windows 95';
                end;
            VER_PLATFORM_WIN32_NT :
                label1.caption := 'Windows NT' ;
          end;
      end;--------------------------------------------------------------------------------
      Const  cOsUnknown : Integer = -1;  cOsWin95 : Integer = 0;  cOsWin98 : Integer = 1;  cOsWin98SE : Integer = 2;  cOsWinME : Integer = 3;  cOsWinNT : Integer = 4;  cOsWin2000 : Integer = 5;  cOsWhistler : Integer = 6;    Function GetOSVersion : Integer;  Function GetOSName( OSCode : Integer ) : String;    Function GetOSVersion : Integer;  Var  osVerInfo : TOSVersionInfo;  majorVer, minorVer : Integer;  Begin  Result := cOsUnknown;  osVerInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );  If ( GetVersionEx( osVerInfo ) ) Then Begin  majorVer := osVerInfo.dwMajorVersion;  minorVer := osVerInfo.dwMinorVersion;  Case ( osVerInfo.dwPlatformId ) Of  VER_PLATFORM_WIN32_NT : { Windows NT/2000 }  Begin  If ( majorVer <= 4 ) Then  Result := cOsWinNT  Else  If ( ( majorVer = 5 ) And ( minorVer= 0 ) ) Then  Result := cOsWin2000  Else  If ( ( majorVer = 5) And ( minorVer = 1 ) ) Then  Result := cOsWhistler  Else  Result := cOsUnknown;  End;  VER_PLATFORM_WIN32_WINDOWS : { Windows 9x/ME }  Begin  If ( ( majorVer = 4 ) And ( minorVer = 0 ) ) Then  Result := cOsWin95  Else If ( ( majorVer = 4 ) And ( minorVer = 10 ) ) Then Begin  If ( osVerInfo.szCSDVersion[ 1 ] = 'A' ) Then  Result := cOsWin98SE  Else  Result := cOsWin98;  End Else If ( ( majorVer = 4) And ( minorVer = 90 ) ) Then  Result := cOsWinME  Else  Result := cOsUnknown;  End;  Else  Result := cOsUnknown;  End;  End Else  Result := cOsUnknown;  End;    Function GetOSName( OSCode : Integer ) : String;  Begin  If ( OSCode = cOsUnknown ) Then  Result := '(sconosciuto)'  Else If ( OSCode = cOsWin95 ) Then  Result := 'Microsoft Windows 95'  Else If ( OSCode = cOsWin98 ) Then  Result := 'Microsoft Windows 98'  Else If ( OSCode = cOsWin98SE ) Then  Result := 'Microsoft Windows 98 Second Edition'  Else If ( OSCode = cOsWinME ) Then  Result := 'Microsoft Windows Millennium Edition'  Else If ( OSCode = cOsWinNT ) Then  Result := 'Microsoft Windows New Technology'  Else If ( OSCode = cOsWin2000 ) Then  Result := 'Microsoft Windows 2000 / NT 5'  Else  Result := 'Microsoft Windows';  End;