ホーム  アプリケーション  ライブラリ  Tips  くだらないTips  リンク集  Borland 賛歌
hydez

Tips

■NT でのシャットダウン
NT でのシャットダウン方法
ここでは、以下のような関数を用意します。

引数
ServerName : シャットダウンするコンピュータ名
Mode : 権限取得/True, 権限開放/False

返却値
権限取得成功時 : True
権限取得失敗時時 : False
function AccessPrivilege(const ServerName:String; const Mode:Boolean):Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
  htoken:THandle;
  tknPrvlgs, tknPrvlgs2:TOKEN_PRIVILEGES;
  success:Boolean;
  res:DWORD;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    Result := False;
    success :=
      OpenProcessToken(
        GetCurrentProcess,
        TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
        htoken
      );
    if not success then Exit;
    success :=
      LookupPrivilegeValue(
        PChar(ServerName),
        PChar(SE_SHUTDOWN_NAME),
        tknPrvlgs.Privileges[0].Luid
      );
    if not success then Exit;
    tknPrvlgs.PrivilegeCount := 1;
    if Mode then
      tknPrvlgs.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
    else
      tknPrvlgs.Privileges[0].Attributes := 0;
    AdjustTokenPrivileges(
      htoken, False, tknPrvlgs, SizeOf(tknPrvlgs2), tknPrvlgs2, res
    );
    if GetLastError() <> ERROR_SUCCESS then Exit;
  end;
  Result := True;
end;

//  呼びだし元
procedure hogehoge;
begin
  if not AccessPrivilege('', True) then
  begin
    ShowMessage('シャットダウン権限の取得に失敗しました。');
    Exit;
  end else if not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0) then
  begin
    ShowMessage('シャットダウンに失敗しました。');
  end;
  AccessPrivilege('', False);
end;
          
ホーム  アプリケーション  ライブラリ  Tips  くだらないTips  リンク集  Borland 賛歌