Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Приоритеты и меню из них. Подскажите. Добавлено: 30.07.05 14:18  

Автор вопроса:  enix
Проблема состоит в задании повышенного порядка(не приоритета имеется ввиду) своей программе. По-этому поводу есть вот это:


Type LUID
    LowPart As Long
    HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
End Type
Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    Privileges("N-1") As LUID_AND_ATTRIBUTES
End Type

Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2

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

Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long

Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long

    Dim hPr As Long
    Dim hTok As Long
    Dim mLUI As LUID
    Dim mPri As TOKEN_PRIVILEGES
    Dim mNPriv As TOKEN_PRIVILEGES

    hPr = GetCurrentProcess()
    OpenProcessToken hPr, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hTok



А дальше возникает вопрос можно ли вручную задать масиву Privileges из типа TOKEN_PRIVILEGES размер для того, чтобы задать программе несколько привилегий и прав, если нет, то как сделать это другим способом.

    

    LookupPrivilegeValue "", "SeShutdownPrivilege", mLUI
    mPriv.PrivilegeCount = 1
    mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
    mPriv.Privileges(0).pLuid = mLUI




..... и как я понимаю можно сделать так и продолжать так дальше сколько надо задать приилегий



    LookupPrivilegeValue "", "..........", mLUI
    mPriv.PrivilegeCount = 2
    mPriv.Privileges(1).Attributes = SE_PRIVILEGE_ENABLED
    mPriv.Privileges(1).pLuid = mLUID
................................

    LookupPrivilegeValue "", "..........", mLUI
    mPriv.PrivilegeCount = N
    mPriv.Privileges(N-1).Attributes =SE_PRIVILEGE_ENABLED
    mPriv.Privileges(N-1.pLuid = mLUID




    AdjustTokenPrivileges hTok, False, mPri, 4 + (12 * mPriv.PrivilegeCount), mNPriv, 4 + (12 * mNPriv.PrivilegeCount)




И на десерт, если это можно так сделать (см. выше), то какие процессы подобрать прграмме для того, чтобы:
перез-ать, выключать и т.д. компьтер; прятать хандл окна, включая в закладке "Процессы" в CADe(потому что у меня не работает єто со всеми приложениями, как я хочу. Использую функцию SetWindowPlacement); и многое другое - этакий универсальный набор дающий много прав.



ПС: Всем кто отнесся с уважением к вопросу или чем-то помог БОЛЬШОЕ СПАСИБО.

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 30.07.05 15:11
можно ли вручную задать масиву Privileges из типа TOKEN_PRIVILEGES размер

Вариант первый.
Объявить стуктуру TOKEN_PRIVILEGES с каждым размером массива отдельно.

Вариант второй.
Объявить одну переменную типа LUID_AND_ATTRIBUTES и один байтовый массив, через последовательные CopyMemory заполнить байтовый массив значениями из LUID_AND_ATTRIBUTES.

Вариант третий (как я обычно делаю).
Использовать CreateSAFEARRAY для создания массива LUID_AND_ATTRIBUTES на основе байтового.
Часть моего модуля:

Public Function AdjustPrivileges(Descr() As Privilege, Optional ByVal hProcess As Long = 0) As SuccessType
  'Удобно это юзать так: получаем массив через ProcessPrivileges,
  'изменяем что нужно, и этот же массив заряжаем сюда...
  Dim b() As Byte, intermed() As LUID_AND_ATTRIBUTES, Size As Long
  Dim h As Long
  
  If OpenProcessToken(IIf(hProcess, hProcess, GetCurrentProcess), TOKEN_ADJUST_PRIVILEGES, h) = 0 Then Err.Raise Err.LastDllError
  
  Size = UBound(Descr) - LBound(Descr) + 1
  ReDim b(1 To Len(Size) + Size * Len(intermed(0)))
  PutMem4 VarPtr(b(LBound(b))), Size
  
  CreateSAFEARRAY ArrPtr(intermed), Len(intermed(0)), VarPtr(b(LBound(b))) + Len(Size), LBound(Descr), UBound(Descr)
  For Size = LBound(Descr) To UBound(Descr)
    intermed(Size).Attributes = Descr(Size).Attributes
    intermed(Size).LUID = Descr(Size).LUID
  Next
  ;DestroySAFEARRAY ArrPtr(intermed)
  
  If AdjustTokenPrivileges(h, 0, b(LBound(b)), UBound(b) - LBound(b) + 1, ByVal 0&, ByVal 0&;) = 0 Then
    Size = Err.LastDllError
    CloseHandle h
    Err.Raise Size
  Else
    'частичный или полный успех?
    AdjustPrivileges = Err.LastDllError
    CloseHandle h
  End If
End Function




Вторая часть вопроса непонятна.

Ответить

Номер ответа: 2
Автор ответа:
 enix



Вопросов: 7
Ответов: 18
 Профиль | | #2 Добавлено: 30.07.05 16:08
Спасибо что помог, но чесно я понял очень мало из написанного, потому что слабо я разбираюсь в испльзовании АПИ функций да и в самом в ВБ, но хочу научиться. А для чего надо это? Я пишу программу и там мне надо прятать окна(например WinRar) - их можно увидеть только в закладке "Процессы" в Диспетчере задач, но работает это не всеми окнами напримем с LightElloy(LA) не сработало вот я и подумал, что проблема в привилегиях моей программы, а вдруг не в них дело ???

Вот код, который я использую для прятанья окон:


Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Private Const SW_MINIMIZE = 6
Private Type POINTAPI
        x As Long
        y As Long
End Type

Private Type WINDOWPLACEMENT
        Length As Long
        flags As Long
        showCmd As Long
        ptMinPosition As POINTAPI
        ptMaxPosition As POINTAPI
        rcNormalPosition As RECT
End Type






Private Sub Command1_Click()
'l = FindWindow(vbNullString, Me.Text1.Text)
    Dim WinEst As WINDOWPLACEMENT
    Dim Punto As POINTAPI
    Dim rtn As Long
    Punto.x = 100
    Punto.y = 100
    WinEst.Length = Len(WinEst)
    WinEst.showCmd = vbHide
    WinEst.ptMinPosition = Punto
    WinEst.ptMaxPosition = Punto
    WinEst.rcNormalPosition = Rectan
    rtn = SetWindowPlacement(l, WinEst)
End Sub



и получается лишь, что окно получает как бы нулевые размеры только из-зи того, что переменная Rectan не заполнена(я ее не заполняю через функцию GetWindowPlacement ..... и т.д.)

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 30.07.05 18:10
Нет, проблема не в привилегиях.

Ответить

Номер ответа: 4
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #4 Добавлено: 30.07.05 20:03
Если тебе нужно прятать окна, зачем такие сложности, может просто

Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

ShowWindow hWnd, 0

hWnd - хендел окна, 0 - спрятать (5 - показать)

сорри мож если не то, я не особо вникал в вопрос.

Ответить

Номер ответа: 5
Автор ответа:
 enix



Вопросов: 7
Ответов: 18
 Профиль | | #5 Добавлено: 30.07.05 21:53
Все вери СЭНК !!!!



ПС: 2GSerg этот код я крутил вертел по-разному и оказалось, что он работает нормально если ты его вписываешь именно в процедуру клика кнопки например - все ок, а из функции не получается - работает только с некоторыми прогами с другими нет. Бред какой-то получается. В общем понял ты меня или нет неважно я тебе благодарен.

ПС2: 2HACKER да эту функцию знаю, но между тем кодом и использованием этой функции есть небольшая разница тот код ныкает прогу даже в закладке "Приложения" и оставляет в процессах, а эта и там и там оставляет. Я решил уже, что это неважно и использую функцию. 2HACKER сєнк.



Все тема исчерпана.

Ответить

Страница: 1 |

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



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