Страница: 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); и многое другое - этакий универсальный набор дающий много прав.
ПС: Всем кто отнесся с уважением к вопросу или чем-то помог БОЛЬШОЕ СПАСИБО.
Ответить
|
Номер ответа: 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
  estroySAFEARRAY 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 ..... и т.д.)
Ответить
|
Страница: 1 |
Поиск по форуму