很多时候,我们可能需要执行关闭计算机或重新启动计算机的操作,但在?WinNT?内核的操作系统中,我们不能只调用简单的?API?函数来完成这样的操作。这并不是一个复杂的问题,却有时候会让人“为难”,如果是这样,现在解决这个问题的办法来了。
????***************************************************************************
????具体使用示例:
????注销当前用户?=>?ExitWin32Sys(EWX_FORCE?or?EWX_LOGOFF);
????重新启动计算机?=>?ExitWin32Sys(EWX_FORCE?or?EWX_REBOOT);
????关闭计算机?=>?ExitWin32Sys(EWX_FORCE?or?EWX_POWEROFF);
????***************************************************************************
具体代码:
uses
??Windows;
function?GetSysTypes:?Boolean;?//?&?获取操作系统类型?&
function?SetPrivilege(sPrivilegeName:?AnsiString;?bEnable:?Boolean):?Boolean;?//?&?设置权限?&
procedure?ExitWin32Sys(iFlags:?Integer);?//?&?执行注销、退出或重启系统的操作?&
implementation
function?GetSysTypes:?Boolean;
var
??Ver:?TOSVersionInfo;
begin
??Result?:=?False;
??Ver.dwOSVersionInfoSize?:=?SizeOf(TOSVersionInfo);
??if?GetVersionEx(Ver)?then
????if?Ver.dwPlatformId?=?VER_PLATFORM_WIN32_WINDOWS?then
??????Result?:=?True
????else
??????Result?:=?False;
end;
function?SetPrivilege(sPrivilegeName:?AnsiString;?bEnable:?Boolean):?Boolean;
var
??TPPrev,?TP:?TTokenPrivileges;
??Token?:?THandle;
??dwRetLen?:?DWord;
begin
??Result?:=?False;
??OpenProcessToken(GetCurrentProcess,?TOKEN_ADJUST_PRIVILEGES?or
???????????????????TOKEN_QUERY,?Token);
??TP.PrivilegeCount?:=?1;
??if?LookupPrivilegeValue(nil,PAnsiChar(sPrivilegeName),TP.Privileges[0].LUID)?then
??begin
????if?bEnable?then
??????TP.Privileges[0].Attributes?:=?SE_PRIVILEGE_ENABLED
????else
??????TP.Privileges[0].Attributes?:=?0;
????dwRetLen?:=?0;
????Result?:=?AdjustTokenPrivileges(Token,?False,?TP,?SizeOf(TPPrev),?TPPrev,?dwRetLen);
??end;
??CloseHandle(Token);
end;
procedure?ExitWin32Sys(iFlags:?Integer);
begin
??if?GetSysTypes?then
????ExitWindowsEx(iFlags,0)
??else
????if?SetPrivilege('SeShutdownPrivilege',True)?then
??????if?not?ExitWindowsEx(iFlags,0)?then
????????SetPrivilege('SeShutdownPrivilege',False);
end;