Страница: 1 |
Страница: 1 |
Вопрос: OpenProcessToken
Добавлено: 12.08.04 15:29
Автор вопроса: Иной
Блин.
==============================================
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" _
(ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, ByRef TokenHandle As Long) As Boolean
sub fignya()
...
OpenProcessToken(GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hTokenHandle)
...
end sub
===========================================
OpenProcessToken возвращает false! Почему?!
Все написано правильно, по MSDN!
Единственное, что смущает:
Windows XP Professional: If the computer is joined to a workgroup and the "Force network logons using local accounts to authenticate as Guest" policy is enabled, the function fails. Note that this policy is enabled by default for a computer running Windows XP Professional that is joined to a workgroup.
У меня Xp как раз. Но в локал секьюрити я подобного пункта не нашел. Может неправильно текст перевел?
Подскажите в чем трабла.
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 12.08.04 15:51
под администратором все нормально, функция возвращает 1, и в hTokenHandle, толкиена хэндл...
Под гостем, скеорее всего, как и написано, ничего не вернется...
Номер ответа: 2
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #2
Добавлено: 12.08.04 16:18
Так и я под админом
Правда я еще и в домене сижу. Может это как-то влияет?
Ты использовал тот код, который я приквел или сам писал?
Номер ответа: 3
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #3
Добавлено: 12.08.04 16:36
короче, я тут как-то политику безопасности настроил, чтобы ко мне никто не лез. Так вот в этом все дело. Вот что в журнале System как Failure Audit написано:
Privileged object operation:
Object Server: Security
Object Handle: 0
Process ID: 620
Primary User Name: DEEP$
Primary Domain: blablabla
Primary Logon ID: (0x0,0x3E7)
Client User Name: blabla
Client Domain: DEEP
Client Logon ID: (0x0,0x3FC02B6)
Privileges: SeShutdownPrivilege
DEEP - имя компа. Теперь нужно искать что в политике не так. Есть соображения? Кстати, я вхожу в группу администраторов, так что доступ по идее не должен быть ограничен.
Номер ответа: 4
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #4
Добавлено: 12.08.04 17:01
нет, в политике все рульно
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 12.08.04 19:32
Я пользовал все как ты написал, может у тебя неверное объявление API ?
Я использовал такое:
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, ByRef TokenHandle As Long) As Long
Номер ответа: 6
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #6
Добавлено: 12.08.04 20:06
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Попробуй вызвать GetLastError для уточнения ошибки...
А если запустить программу от имени SYSTEM? У нее вообще всемогущие
привелегии.... Это поможет выяснить, в них ли дело.
Номер ответа: 7
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #7
Добавлено: 13.08.04 09:00
2 sne
У меня объявление функции с возвратом Boolean, но не в этом дело. Менял на Long - та же каша
Номер ответа: 8
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #8
Добавлено: 13.08.04 10:28
2 Павел
Я уже пробовал ГетЛастЕрор. Прикол в том, что она возвращает:
17179870182
а описание ошибки с таким кодом нет.
От имени Систем запустить не удается
C:\Temp>runas /user:"nt authority\system" cmd
Enter the password for nt authority\system:
RUNAS ERROR: Unable to acquire user password
Пароль не ввожу никакой.
Номер ответа: 9
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #9
Добавлено: 13.08.04 10:54
Так, я еще раз попробовал сделать по совету sne (объявить как Лонг) и у меня функция вернула >0, НО, он не возвращает мне TokenHandle, он остается нулем.
код:
Public Module System
'Консанты для функции ExitWindowsEx
Private Const EWX_LogOff As Long = 0
Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_REBOOT As Long = 2
Private Const EWX_FORCE As Long = 4
Private Const EWX_POWEROFF As Long = 8
Private Const SE_PRIVILEGE_ENABLED As Long = &H2
Private Const TOKEN_ADJUST_PRIVILEGES As Long = 32 '&H20
Private Const TOKEN_QUERY As Long = 8 '&H8
Private Const TOKEN_ALL_ACCESS As Long = &HF01FF
Private Const SE_SHUTDOWN_NAME As String = "SeShutdownPrivilege"
Private Structure LUID
Public LowPart As Long
Public HighPart As Long
End Structure
Private Structure LUID_AND_ATTRIBUTES
Public pLuid As LUID
Public Attributes As Long
End Structure
Private Structure TOKEN_PRIVILEGES
Public PrivilegeCount As Long
Public Luid As LUID
Public Attributes As Long
'Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Structure
Private Declare Function LockWorkStation Lib "user32.dll" () As Long
Private Declare Function ExitWindowsEx Lib "user32.dll" _
 ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" _
 ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, ByRef NewState As TOKEN_PRIVILEGES, _
ByVal BufferLength As Long, ByRef PreviousState As TOKEN_PRIVILEGES, ByRef ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" _
 ByRef lpSystemName As String, ByRef lpName As String, ByRef lpLuid As LUID) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" _
 ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, ByRef TokenHandle As Long) As Long
Public Declare Function GetLastError Lib "kernel32.dll" () As Long
Private Function AllowTokenShutdown() As Boolean
Try
 im hProcessHandle As Long
 im hTokenHandle As Long
 im tmpLuid As LUID
 im tkp As TOKEN_PRIVILEGES
 im tkpNewButIgnored As TOKEN_PRIVILEGES
 im lbuffer As Long
hProcessHandle = GetCurrentProcess()
If OpenProcessToken(hProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hTokenHandle) = 0 _
Then 'hTokenHandle возвращается 0
 im l As Long
l = GetLastError()
Return False
End If
If LookupPrivilegeValue("", SE_SHUTDOWN_NAME, tmpLuid) = 0 Then Return False
With tkp
.PrivilegeCount = 1
.Luid = tmpLuid
.Attributes = SE_PRIVILEGE_ENABLED
End With
If AdjustTokenPrivileges(hTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lbuffer) = 0 _
Then Return False
Return True
Catch ex As Exception
Return False
End Try
End Function
end module
Номер ответа: 10
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #10
Добавлено: 13.08.04 14:20
Кое что начинает проясняться.
Я брал пример, по которому писал этот код, с VB6 и напрочь упустил из виду, что в .Нете типы данных изменились. То что было Long в VB6 теперь есть не что иное как Integer!!! Надо же так лажануться.
Теперь у меня GetLastError после GetCurrentProccess возвращает 126, что соответствует:
The specified module could not be found.
Что это за фрукт - предстоит разбираться.
Номер ответа: 11
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #11
Добавлено: 13.08.04 14:24
Гм.. А я почему-то сразу глянул на объявления функций и подумал, что
ты с форумом ошибся, не туда написал...
Аккуратнее надо!
Номер ответа: 12
Автор ответа:
Иной
Вопросов: 19
Ответов: 50
Профиль | | #12
Добавлено: 13.08.04 15:01
Согласен. Сори.
А что в ВБ.Нет соответствует типу "null-terminated string"?