Winapi ExitWinDowsecx即使在调整我的特权令牌后也会失败
我正在尝试以编程方式关闭Windows:Winapi ExitWinDowsecx即使在调整我的特权令牌后也会失败,winapi,realbasic,system-shutdown,Winapi,Realbasic,System Shutdown,我正在尝试以编程方式关闭Windows: Function ExitWindows() As Integer Declare Function GetCurrentProcess Lib "Kernel32" () As Integer Declare Function OpenProcessToken Lib "AdvApi32" (handle As Integer, access As Integer, ByRef tHandle As Integer) As Boolean
Function ExitWindows() As Integer
Declare Function GetCurrentProcess Lib "Kernel32" () As Integer
Declare Function OpenProcessToken Lib "AdvApi32" (handle As Integer, access As Integer, ByRef tHandle As Integer) As Boolean
Declare Function LookupPrivilegeValueW Lib "AdvApi32" (sysName As Ptr, privName As WString, Luid As Ptr) As Boolean
Declare Function AdjustTokenPrivileges Lib "AdvApi32" (tHandle As Integer, disableAllPrivs As Boolean, newState As Ptr, buffLength As Integer, prevPrivs As Ptr, ByRef retLen As Integer) As Boolean
Declare Function ExitWindowsEx Lib "User32" (flags As Integer, reason As Integer) As Boolean
Declare Function GetLastError Lib "Kernel32" () As Integer
Const SE_PRIVILEGE_ENABLED = &h00000002
Const TOKEN_QUERY = &h00000008
Const TOKEN_ADJUST_PRIVILEGES = &h00000020
Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Const EWX_SHUTDOWN = &h00000001
Dim pHandle As Integer = GetCurrentProcess() //a handle to the current process
Dim tHandle As Integer //a handle to the token
If OpenProcessToken(pHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, tHandle) Then
Dim mb As New MemoryBlock(8)
mb.UInt32Value(0) = 1
mb.Int32Value(4) = SE_PRIVILEGE_ENABLED
Dim pt As Ptr
If LookupPrivilegeValueW(Nil, "SeShutdownPrivilege", mb) Then
Dim z As Integer
If AdjustTokenPrivileges(tHandle, False, mb, mb.Size, pt, z) Then
If Not ExitWindowsEx(EWX_SHUTDOWN, 0) Then
Return GetLastError() //Returns 1314
End If
Else
Return GetLastError()
End If
Else
Return GetLastError()
End If
Else
Return GetLastError()
End If
End Function
每个函数调用都会成功,但ExitWindowsEx除外,即使以管理员身份运行,ExitWindowsEx也会始终失败,错误代码为1314(未保留权限)。重新启动有同样的问题,但注销工作
我在这里做错了什么?您正在使用错误的mb调用LookupPrivilegeValueW,并将错误的mb传递给我
Dim luid As New MemoryBlock(8)
If LookupPrivilegeValueW(Nil, "SeShutdownPrivilege", luid) Then
Dim mb As New MemoryBlock(16)
mb.UInt32Value(0) = 1
mb.UInt32Value(4) = luid.UInt32Value(0)
mb.UInt32Value(8) = luid.UInt32Value(4)
mb.UInt32Value(12) = SE_PRIVILEGE_ENABLED
Dim z As Integer
If AdjustTokenPrivileges(tHandle, False, mb, mb.Size, pt, z) Then
我认为您的
mb
参数在AdjustTokenPrivileges
调用中不正确。看@Roman R.我不明白你的意思。LUID不是8字节长吗?不太长。对于LUID和属性,参数为每个元素4字节计数+12字节。你每件事都只传递8个字节。所以,即使有非常大的内存块,我仍然得到1314作为错误返回。啊,太棒了!谢谢你。