- 題名: WMIを介してWindowsシャットダウン
- 日時: 2003/07/28 15:09:03
- ID: 235
- この記事の返信元:
- (なし)
- この記事への返信:
- [242] Re[1]: WMIを介してWindowsシャットダウン2003/07/30 14:14:33
- ツリーを表示
> >というエラーになるのは何故かという件でしょうか? > そうなんです。 .Scope.Options.EnablePrivilegesはなんのためにあるのかは 私もよく分かりませんが、1つの代替策はWin32APIで特権を獲得 することでしょう。 これ↓で私のW2kProでリブートできました。 (※動作したものの私もよくわからず組んだので信用しないこと(^^;) 'Imports System.Management 'Imports System.Security.Principal '************************************************************************** 'ローカルマシンのログオフorリブートorシャットダウンを行う '@param iMode 0=ログオフ 2=リブート 8=電源断 (各々の数字に4を足せば強制モード) '************************************************************************** Private Sub doShutdown(ByVal iMode As Integer) Dim hasPrivilege As Boolean '特権獲得成功識別Flag '*** Win32APIで特権獲得 (9X系なら飛ばすようにすべき) *** Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege" Const SE_PRIVILEGE_ENABLED As Int32 = &H2 Dim tknPrivilege As TOKEN_PRIVILEGES If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, _ tknPrivilege.Privileges.pLuid) Then tknPrivilege.PrivilegeCount = 1 tknPrivilege.Privileges.Attributes = SE_PRIVILEGE_ENABLED If AdjustTokenPrivileges(WindowsIdentity.GetCurrent.Token(), _ 0, tknPrivilege, Len(tknPrivilege), _ Nothing, 0) Then hasPrivilege = True End If End If If Not hasPrivilege Then '<特権獲得に失敗した場合> '実行しているアカウントが本当に権限を持っていないとか... '(ドメインの権限設定やローカル セキュリティ ポリシーで要確認) Return End If '*** System.ManagementでShutdown *** Const WQL_SELECT_OS = "select name from Win32_OperatingSystem where primary=true" Dim moOS As ManagementObject For Each moOS In New ManagementObjectSearcher(WQL_SELECT_OS).Get() 'moOS.Scope.Options.EnablePrivileges = True これが効かないので上のAPIで取っている moOS.InvokeMethod("Win32Shutdown", New String() {CStr(iMode), "0"}) Next End Sub #Region "doShutdownで特権獲得に使用するAPI" Structure LUID_AND_ATTRIBUTES Dim pLuid As LARGE_INTEGER Dim Attributes As Int32 End Structure Structure LUID Dim LowPart As Int32 Dim HighPart As Int32 End Structure Structure LARGE_INTEGER Dim lowpart As Int32 Dim highpart As Int32 End Structure Structure TOKEN_PRIVILEGES Dim PrivilegeCount As Int32 Dim Privileges As LUID_AND_ATTRIBUTES End Structure Declare Auto Function AdjustTokenPrivileges Lib "advapi32.dll" ( _ ByVal TokenHandle As IntPtr, _ ByVal DisableAllPrivileges As Int32, _ ByRef NewState As TOKEN_PRIVILEGES, _ ByVal BufferLength As Int32, _ ByRef PreviousState As TOKEN_PRIVILEGES, _ ByRef ReturnLength As Int32) As Int32 Declare Auto Function LookupPrivilegeValue Lib "advapi32.dll" ( _ ByVal lpSystemName As String, _ ByVal lpName As String, _ ByRef lpLuid As LARGE_INTEGER) As Int32 #End Region
現在、System.Management名前空間を介して、Win32Shutdownメソッドを実行して
Windowsシャットダウンを行う関数を作成中なのですが、
ローカルシャットダウンの特権をどのように与えるのか分からなくて困っています。
vb6では出来たのですが、VB.NETではどうすればいいのでしょうか?
参考url等でも教えていただければありがたいです。
よろしくお願いします。