Страница: 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик 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" _ ![]() Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" _ ![]() ByVal BufferLength As Long, ByRef PreviousState As TOKEN_PRIVILEGES, ByRef ReturnLength As Long) As Long Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" _ ![]() Private Declare Function OpenProcessToken Lib "advapi32.dll" _ ![]() Public Declare Function GetLastError Lib "kernel32.dll" () As Long Private Function AllowTokenShutdown() As Boolean Try ![]() ![]() ![]() ![]() ![]() ![]() hProcessHandle = GetCurrentProcess() If OpenProcessToken(hProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hTokenHandle) = 0 _ Then 'hTokenHandle возвращается 0 ![]() 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"? |
Страница: 1 |
|