- PR -

VB2005 ExpressにてW2Kでのシャットダウンをするのに特権を有効しようとするが有効にならない。

1
投稿者投稿内容
takesan
会議室デビュー日: 2003/06/19
投稿数: 3
投稿日時: 2006-11-19 01:02
Private Structure LUID
Dim UsedPart As Long
Dim IgnoredForNowHigh32BitPart As Long
End Structure

Private Structure TOKEN_PRIVILEGES
Dim PrivilegeCount As Long
Dim TheLuid As LUID
Dim Attributes As Long
End Structure

Private Declare Function OpenProcessToken Lib "advapi32" ( _
ByVal ProcessHandle As IntPtr, _
ByVal DesiredAccess As Integer, _
ByRef TokenHandle As IntPtr _
) As Boolean

Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" ( _
ByVal lpSystemName As String, _
ByVal lpName As String, _
ByRef lpLuid As LUID _
) As Boolean

Private Declare Function GetCurrentProcess Lib "kernel32" () As IntPtr

Private Declare Function AdjustTokenPrivileges Lib "advapi32" ( _
ByVal TokenHandle As IntPtr, _
ByVal DisableAllPrivileges As Boolean, _
ByRef NewState As TOKEN_PRIVILEGES, _
ByVal BufferLength As Integer, _
ByRef PreviousState As TOKEN_PRIVILEGES, _
ByVal ReturnLength As IntPtr _
) As Boolean

Private Declare Function ExitWindowsEx Lib "user32" ( _
ByVal dwOptions As Int32, _
ByVal dwReserved As Int32 _
) As Int32

Private Const TOKEN_QUERY = &H8
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Private Const SE_PRIVILEGE_ENABLED = &H2

Public Const EWX_FORCE = &H4
Public Const EWX_LOGOFF = &H0
Public Const EWX_REBOOT = &H2
Public Const EWX_SHUTDOWN = &H1
Public Const EWX_POWEROFF = &H8

Public Sub sShutdown(ByVal myFlags As Long)
Dim lngResult As Boolean
If CreateObject("SYSINFO.Sysinfo").OSPlatform = 2 Then
Dim hTokenHandle As IntPtr
Dim tmpLuid As LUID
Dim tkpNew As TOKEN_PRIVILEGES
lngResult = OpenProcessToken(GetCurrentProcess, TOKEN_QUERY Or TOKEN_ADJUST_PRIVILEGES, hTokenHandle)
If Not lngResult Then Exit Sub
lngResult = LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tmpLuid)
If Not lngResult Then Exit Sub
tkpNew.PrivilegeCount = 1
tkpNew.TheLuid = tmpLuid
tkpNew.Attributes = SE_PRIVILEGE_ENABLED
lngResult = AdjustTokenPrivileges(hTokenHandle, False, tkpNew, Nothing, Nothing, Nothing)
If Not lngResult Then Exit Sub
End If
lngResult = ExitWindowsEx(myFlags, 0&)
End Sub

VB2005 Express で上記のコードを書き込んでいますがAdjust実行後のlngResultにはfalseしか返ってこないのですが、どの部分が間違っているのかがわからないでいます。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-11-19 02:00
取りあえず、LUID は 16 バイトもないと思います。
takesan
会議室デビュー日: 2003/06/19
投稿数: 3
投稿日時: 2006-11-19 17:16
LUIDが16バイトもないという事ですがどのようにしたらいいのですか?
ヒントのHPとかあれば教えてください。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-11-19 17:48
引用:

takesanさんの書き込み (2006-11-19 17:16) より:
LUIDが16バイトもないという事ですがどのようにしたらいいのですか?
ヒントのHPとかあれば教えてください。


自分で調べられるだろう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-20 23:35
引用:

takesanさんの書き込み(2006-11-19 01:02)より:
LUIDが16バイトもないという事ですがどのようにしたらいいのですか?
ヒントのHPとかあれば教えてください。


反対に、(投稿日時: 2006-11-19 01:02) のコードは、なにを参照して作成したのか、教えてください。
引用:

コード:
Private Structure LUID
    Dim UsedPart As Long
    Dim IgnoredForNowHigh32BitPart As Long
End Structure

Private Structure TOKEN_PRIVILEGES
    Dim PrivilegeCount As Long
    Dim TheLuid As LUID
    Dim Attributes As Long
End Structure




となっていますが、私が MSDN (2006JAN) を調べたところ、次のように定義されています。
コード:
typedef struct _TOKEN_PRIVILEGES {
    DWORD PrivilegeCount;
    LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

typedef struct _LUID_AND_ATTRIBUTES {
    LUID Luid;
    DWORD Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;

typedef struct _LUID {
    DWORD LowPart;
    LONG HighPart;
} LUID, *PLUID;



このことから、次のような定義なると思うのです。
コード:
Structure TOKEN_PRIVILEGES
    Dim PrivilegeCount As UInt32
    Dim Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Structure

Structure LUID_AND_ATTRIBUTES
    Dim Luid As LUID
    Dim Attributes As UInt32
End Structure

Structure LIUD
    Dim LowPart As UInt32
    Dim HighPart As Int32
End Structure


LUID_AND_ATTRIBUTES が抜けているのですが、なにを参考にされたのですか?

_________________
1

スキルアップ/キャリアアップ(JOB@IT)