谁能给我一个能在服务程序下强制关机2000/XP的代码?
解决方案 »
- 大端模式
- ACCESS语句转换成SQL SERVER语句
- 不费神的50分。
- 我想要一个控件它的功能和excel一样,具有和DBcombobox的下拉功能,同时能联数据库和打印预览,高手帮忙推荐!!!
- 怎样强制终止 进程外组件!
- 从一个表中查询出结果,并写到另一个表中的程序,这样写对吗?请高手过招,给分。
- 怎样用DBGrid连接多个表,不用SQL,在线等候。
- 急!等! 为何打不开文件,打开是出错! 100分!求解?错误如下
- 哪里有对文件操作类似的文章。
- 请问有谁知道ProDelphi的用法?
- 初学者问题:在一个窗体显示要显示另一个窗体为什么出错?
- 在DELPHI 7中还原数据库,数据库是ACCESS 2000
注销:MyExitWindows(EWX_LogOff);
重启:MyExitWindows(EWX_REBOOT);
关机:MyExitWindows(EWX_SHUTDOWN);
}
function SetShutdownPrivilege(Enable: Boolean): Boolean;
var
PrevPrivileges: TTokenPrivileges;
Privileges: TTokenPrivileges;
Token: THandle;
dwRetLen: DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
Privileges.PrivilegeCount := 1;
if LookupPrivilegeValue(nil,'SeShutdownPrivilege', Privileges.Privileges[0].LUID) then
begin
if Enable then
Privileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
Privileges.Privileges[0].Attributes := 0;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token, False, Privileges, SizeOf(PrevPrivileges), PrevPrivileges, dwRetLen);
end;
CloseHandle(Token);
end;procedure MyExitWindows(const P:Word);
begin
Application.Terminate;
if IsWin9x then
ExitWindowsEx(EWX_FORCE or P, 0)
else
begin
SetShutdownPrivilege(True);
ExitWindowsEx(EWX_FORCE or P, 0);
SetShutdownPrivilege(False);
end;
end;
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeShutdownPrivilege';
PRIV_SIZE = sizeOf(TTokenPrivileges);
var
uFlags: Cardinal;
Len: DWORD;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
Error: integer;
begin
error := 0;
if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
Error := Error or 4;
if not LookupPrivilegeValue(nil, SHTDWN_PRIV, TokenPriv.Privileges[0].Luid) then
Error := Error or 8;
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TokenPriv.PrivilegeCount := 1; // One privilege to set
if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE, Dummy, Len) then
Error := Error or 16;
case Action of
0: uFlags := EWX_POWEROFF + EWX_SHUTDOWN; //提示关机
1: uFlags := EWX_POWEROFF + EWX_FORCE; //强制关机
2: uFlags := EWX_ReBoot; //提示重启系统
3: uFlags := EWX_ReBoot + EWX_FORCE; //强制重启系统
end;
if Application.MessageBox(PChar('您是否要执行 ''' + inttostr(cbAction.ItemIndex) +':'+ cbAction.Text +''' 操作?'),PChar('提示'),MB_YESNO + MB_ICONQUESTION) = IDYES then
ExitWindowsEx(uFlags, 0);
Result := (Error = 0);
end;