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); //获取当然操作系统信息
{*******************************************************************************
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); //获取当然操作系统信息
解决方案 »
- 程序关闭时,无效的窗口句柄!
- 谁在WWW.PUDN.COM上有需要下的代码,我替大家下
- 【推荐】对P2P音视频通讯程序感兴趣的朋友和在这方面有经验的大虾请进来!
- 这样的函数funa(char **srcUsr)在delphi中如何调用?
- 我把一个Form窗体Dock进一个Panel。。。。。。。
- 讨论像Winamp具有磁性的可拖动几个窗体的问题
- 开发中何种文档最有用? ?分!
- 正在创业或正在想创业的程序员过来讨论一下!程序员创业有点因难!!!
- 开发数据库程序,用谁的开发效率高,PB,delphi,C++builder?
- 能不能给我提供delphi5(不是delphi6)的版本序列号
- BDE安装?
- 怎样在DELPHI程序中拨号上网 ?
{$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;