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); //获取当然操作系统信息
关于你的第二个问题: {$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;
老话题了; ****************** 在Windows2000下关闭计算机 function ShutDownSystem():BOOL; var hProcess,hAccessToken:THandle; LUID_AND_ATTRIBUTES:TLUIDAndAttributes; TOKEN_PRIVILEGES: TTokenPrivileges; BufferIsNull:DWORD; Const SE_SHUTDOWN_NAME='SeShutdownPrivilege'; begin 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_PRIVI LEGES),Nil,BufferIsNull); ExitWindowsEx(EWX_REBOOT, 0); ShutDownSystem:=True; end;
2 怎样判断当前的操作系统是什么操作系统
{*******************************************************************************
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); //获取当然操作系统信息
{$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;
******************
在Windows2000下关闭计算机
function ShutDownSystem():BOOL;
var
hProcess,hAccessToken:THandle;
LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
TOKEN_PRIVILEGES: TTokenPrivileges;
BufferIsNull:DWORD;
Const
SE_SHUTDOWN_NAME='SeShutdownPrivilege';
begin
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_PRIVI
LEGES),Nil,BufferIsNull);
ExitWindowsEx(EWX_REBOOT, 0);
ShutDownSystem:=True;
end;