by ゲスト » 2009年1月11日(日) 21:00
> まだシャットダウンできていません。
>
> 現在のコード
>
>
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
> '動作フラグ============
> Const EWX_LOGOFF=0
> Const EWX_SHUTDOWN=1
> Const EWX_REBOOT=2
> Const EWX_FORCE=4
> Const EWX_POWEROFF=8
> '====================
>
> Sub ExitWindows()
> Dim Handle As HANDLE
> Dim TPS As TOKEN_PRIVILEGES
> Dim TPS_P As TOKEN_PRIVILEGES
> Dim Size As Long
>
> Dim lpBuf(ERRMESSAGE_MAX) As SByte
> Dim ErrID As Long
>
> With TPS
> .PrivilegeCount=1
> .Privileges[ANYSIZE_ARRAY].Attributes=SE_PRIVILEGE_ENABLED
> End With
>
> If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
> MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "OpenProcessToken", MB_OK)
> EndIf
> EndIf
>
> If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(ANYSIZE_ARRAY).Luid)=FALSE Then
> MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "LookupPrivilegeValue", MB_OK)
> EndIf
> EndIf
>
> If AdjustTokenPrivileges(Handle As Long,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
> MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "AdjustTokenPrivileges", MB_OK)
> EndIf
> EndIf
>
> ExitWindowsEx(EWX_REBOOT,0)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "ExitWindowsEx", MB_OK)
> EndIf
>
> End Sub
>
> AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
> この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。
>
> 何だろうなぁ??
>
> 余談ですが、AB5のapi_system.sbpで
>
> >>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_
>
> となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・
> まだシャットダウンできていません。
>
> 現在のコード
>
> [hide][list][code]
> '動作フラグ============
> Const EWX_LOGOFF=0
> Const EWX_SHUTDOWN=1
> Const EWX_REBOOT=2
> Const EWX_FORCE=4
> Const EWX_POWEROFF=8
> '====================
>
> Sub ExitWindows()
> Dim Handle As HANDLE
> Dim TPS As TOKEN_PRIVILEGES
> Dim TPS_P As TOKEN_PRIVILEGES
> Dim Size As Long
>
> Dim lpBuf(ERRMESSAGE_MAX) As SByte
> Dim ErrID As Long
>
> With TPS
> .PrivilegeCount=1
> .Privileges[ANYSIZE_ARRAY].Attributes=SE_PRIVILEGE_ENABLED
> End With
>
> If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
> MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "OpenProcessToken", MB_OK)
> EndIf
> EndIf
>
> If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(ANYSIZE_ARRAY).Luid)=FALSE Then
> MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "LookupPrivilegeValue", MB_OK)
> EndIf
> EndIf
>
> If AdjustTokenPrivileges(Handle As Long,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
> MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "AdjustTokenPrivileges", MB_OK)
> EndIf
> EndIf
>
> ExitWindowsEx(EWX_REBOOT,0)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "ExitWindowsEx", MB_OK)
> EndIf
>
> End Sub
> [/code][/list][/hide]
> AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
> この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。
>
> 何だろうなぁ??
>
> 余談ですが、AB5のapi_system.sbpで
>
> >>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_
>
> となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・