本人是Delphi的Beginner,请教Windows NT下如何实现关机。多谢,多谢!
解决方案 »
- 新人求教report machine 安装问题
- 问一个指针简单的释放问题,
- 求怎样实现按用户输入的编号来对当前的DbGrid中的内容查找后定位显示在DbGrid中。在线等...
- delphi如何运行exe文件
- 制作安装文件、DBGrid,等几个问题,分不够,我会再加的
- 字符串的判断问题!!!!!!!!!!!!!!!!!!!!!!!!????????????????
- DBGrid使用问题。
- 极其简单的问题,突然发现不好解决了,散分!
- 问问数据库的价格
- 求救(delphi 自定义公式存储,求值问题)
- 中秋了,在外打工的程序员,又一个难眠之夜。祝愿大家节日愉快,代码没有Bug!强烈散分。
- 如何判断一个集合类型的变量是否为空
function SetPrivilege(sPrivilegeName:string;bEnabled:boolean):boolean;
var
TP,TPPre:TTokenPrivileges;
Token:THandle;
dwLength:DWORD;
begin
result := false;
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Token);
try
TP.PrivilegeCount := 1;
if LookupPrivilegeValue(nil,PChar(sPrivilegeName),TP.Privileges[0].LUID) then
begin
if bEnabled then
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
TP.Privileges[0].Attributes := 0;
dwLength := 0;
Result := AdjustTokenPrivileges(Token,false,TP,sizeof(TPPre),TPPre,dwLength);
end;
finally
CloseHandle(Token);
end;
end;调用:
SetPrivilege('SeShutdownPrivilege',true);
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF,0);
procedure TAPIMisc.PowerOff(Force:boolean=false);
var
hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
begin
if Win32Platform=VER_PLATFORM_WIN32_NT then // we've got to do a whole buch of things
begin
zero := 0;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, 'PowerOff Error', 'OpenProcessToken() Failed', MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, 'PowerOff Error', 'OpenProcessToken() Failed', MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
// SE_SHUTDOWN_NAME
if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
begin
MessageBox( 0, 'PowerOff Error', 'LookupPrivilegeValue() Failed', MB_OK );
Exit;
end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
if Boolean( GetLastError() ) then
begin
MessageBox( 0, 'PowerOff Error', 'AdjustTokenPrivileges() Failed', MB_OK );
Exit;
end // if Boolean( GetLastError() )
else if Force then ExitWindowsEx( EWX_Force or EWX_POWEROFF, 0 )
else ExitWindowsEx( EWX_POWEROFF, 0 );
end // if OSVersion = 'Windows NT'
else // just shut the machine down
if Force then ExitWindowsEx( EWX_Force or EWX_POWEROFF, 0 )
else ExitWindowsEx( EWX_POWEROFF, 0 );
end;