Tietew です。

On Thu, 31 Jan 2002 13:17:40 +0900
In article <20020131130329.8821.GGB03124 / nifty.ne.jp>
[[ruby-list:33689] Windows をリブートするスクリプトはありますか?。]
Take_tk <ggb03124 / nifty.ne.jp> wrote:

> ここで、ちょいと問題がありまして、レジストリレベルの Environment\path の
> 設定を変えても、Windows をリブートしないと ENV の環境変数に反映されない
> ようなのです。

マイコンピュータのプロパティを開いて,環境変数の一覧を出してから
確定すると反映されるので何か手があるんだと思いますけど,判りませ
ん (^^;;

> そこで、次のようなリブートメソッドを作ったのですが、セキュリティが何たら
> で自動リブートに失敗してしまいます。
 :
> どちら様か、Windows をリブートするスクリプトを既に作っておられないでしょ
> うか?。

うーん,こんな感じ?

OpenProcessToken = Win32API.new('advapi32.dll', 'OpenProcessToken', 'LLP', 'L')
LookupPrivilegeValue = Win32API.new('advapi32.dll', 'LookupPrivilegeValueA', 'PPP', 'L')
AdjustTokenPrivileges = Win32API.new('advapi32.dll', 'AdjustTokenPrivileges', 'LLPLPP', 'L')
GetCurrentProcess = Win32API.new('kernel32.dll', 'GetCurrentProcess', 'V', 'L')
GetLastError = Win32API.new('kernel32.dll', 'GetLastError', 'V', 'L')
CloseHandle = Win32API.new('kernel32.dll', 'CloseHandle', 'L', 'L')

token = ' ' * 4
OpenProcessToken.call(GetCurrentProcess.call, 0x28, token)
token = token.unpack('V')[0]
luid = ' ' * 8
LookupPrivilegeValue.call("", "SeShutdownPrivilege", luid)
luid = luid.unpack('VV')
tkp1 = [ 1, luid[0], luid[1], 2 ].pack('VVVV')
tkp2 = [ 1, 0, 0, 0 ].pack('VVVV')

size = ' ' * 4
r = AdjustTokenPrivileges(token, 0, tkp1, tkp2.size, tkp2, size)
if r == 0 || GetLastError.call == 1300
  CloseHandle.call(token)
  raise "You don't have SE_SHUTDOWN_NAME privilege!"
end
CloseHandle.call(token)

# シャットダウン行程に進む


―[ Tietew ]――――――――――――――――――――――――――
 メ : tietew / tietew.net / tietew / raug.net / tietew / masuclub.net
ホペ: http://www.tietew.net/     Tietew Windows Lab.
      http://www.masuclub.net/   鱒倶楽部
指紋: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA