Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: www.vbnet.ru
 Профиль | | #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

      ;Dim hProcessHandle As Long
      ;Dim hTokenHandle As Long
      ;Dim tmpLuid As LUID
      ;Dim tkp As TOKEN_PRIVILEGES
      ;Dim tkpNewButIgnored As TOKEN_PRIVILEGES
      ;Dim lbuffer As Long

      hProcessHandle = GetCurrentProcess()

      If OpenProcessToken(hProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hTokenHandle) = 0 _
  Then 'hTokenHandle возвращается 0
        ;Dim 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-сайт: www.vbnet.ru
 Профиль | | #11
Добавлено: 13.08.04 14:24
Гм.. А я почему-то сразу глянул на объявления функций и подумал, что
ты с форумом ошибся, не туда написал...
Аккуратнее надо!

Ответить

Номер ответа: 12
Автор ответа:
 Иной



Вопросов: 19
Ответов: 50
 Профиль | | #12 Добавлено: 13.08.04 15:01
Согласен. Сори.
А что в ВБ.Нет соответствует типу "null-terminated string"?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам