powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как разбираться с Object в котором SECURITY_DESCRIPTOR как variant safe array of unsigned
3 сообщений из 3, страница 1 из 1
Как разбираться с Object в котором SECURITY_DESCRIPTOR как variant safe array of unsigned
    #39795471
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо дать определеные права (farQUERY_JOBS) определенному пользователю факс-сервера (SYSTEM).

На выходе-входе имеем вот эту хрень:
FaxSecurity.Descriptor property

Код: vbnet
1.
Property Descriptor As Variant


Property valueA Variant that specifies or receives the security descriptor. The security descriptor is a SECURITY_DESCRIPTOR structure and is represented as a variant safe array of unsigned characters (VT_ARRAY | Integer).


В .Net оно из Interop возвращается как As Object.

Оригинальный код разбора сего на C++ (из SDK) применно такой.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
PACL g_pDACL;
PSECURITY_DESCRIPTOR* g_pSecurityDescriptor;

        BOOL fFlag;
        BOOL fDaclPresent = FALSE;
        BOOL fDaclDefaulted = TRUE;
        VARIANT vDescriptor;
        VariantInit(&vDescriptor);

        //Get the security descriptor from FaxSecurity
        hr = pFaxSecurity->put_InformationType(DACL_SECURITY_INFORMATION);
        hr = pFaxSecurity->get_Descriptor(&vDescriptor);    
        hr = SafeArrayAccessData(vDescriptor.parray, (void **) &g_pSecurityDescriptor);
        //Get the DACL
        fFlag = GetSecurityDescriptorDacl(g_pSecurityDescriptor,&fDaclPresent, &g_pDACL, &fDaclDefaulted);



В общем мне надо:
1) получить из objFaxSecurity.Descriptor As Object текущий DACL: pOldDACL As IntPtr, ключевой видимо будет ф-ция GetSecurityDescriptorDacl
2) добавить в pOldDACL нужные мне права для нужного юзера и получить новый DACL: pNewDACL As IntPtr (это я умею!!! есть коды, делал для папок/файлов, сервисов, кустов реестра и т.п.)
3) впихнуть этот новый pNewDACL обратно в objFaxSecurity.Descriptor As Object, предполагаю SetSecurityDescriptorDacl, ну и применить метод .Save как того требует COM.

Вот пытаюсь как-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
  Public Declare Function GetSecurityDescriptorDacl Lib "advapi32.dll" _
   (ByVal pSecurityDescriptor As IntPtr, ByRef lpbDaclPresent As Boolean, ByRef pDacl As IntPtr, ByRef lpbDaclDefaulted As Boolean) As Boolean


    Private Sub ButtonSecurity_Click(sender As Object, e As EventArgs) Handles ButtonSecurity.Click
    Dim objFaxSecurity As FAXCOMEXLib.FaxSecurity
    objFaxSecurity = g_objFaxServer.Security
    objFaxSecurity.InformationType = DACL_SECURITY_INFORMATION
    Dim oSecurity As Object = objFaxSecurity.Descriptor
    Dim vSecurity As IntPtr = Marshal.AllocCoTaskMem(1024)
    Marshal.GetNativeVariantForObject(oSecurity, vSecurity)
    Dim fFlag As Boolean
    Dim fDaclPresent As Boolean = False
    Dim fDaclDefaulted As Boolean = True
    Dim pOldDACL As IntPtr
    fFlag = GetSecurityDescriptorDacl(vSecurity, fDaclPresent, pOldDACL, fDaclDefaulted)
    If fFlag = False Then
      MsgBox(RaiseAPIError())
    End If

    'objFaxSecurity.Descriptor = pNewDACL
    'objFaxSecurity.Save()
    Marshal.FreeCoTaskMem(vSecurity)

  End Sub


GetSecurityDescriptorDacl мне пишет ошибку 1305 (уровень редакции неизвестен)

COM отдает мне кота в мешке Object ==A Variant that specifies or receives the security descriptor. The security descriptor is a SECURITY_DESCRIPTOR structure and is represented as a variant safe array of unsigned characters (VT_ARRAY | Integer)
Мне эта структура по сути не нужна, а нужен указатель pOldDACL в ней сидящий.
Но мне нужно из этого Object получить pOldDACL через GetSecurityDescriptorDacl,
ну очевидно первый параметр как то по другому надо готовить, как не знаю.
vDescriptor .parray +SafeArrayAccessData(?)
Есть идеи как это высосать?
Голая документация, примеров в гугле ноль, C++ не катит.
(аналогов этой security кухни через классические Fax Service API for win2000 нет, только COMEx-либа, она в принципе понятная и VB-ориентированная, но видимо не в данном конкретном действе)
...
Рейтинг: 0 / 0
Как разбираться с Object в котором SECURITY_DESCRIPTOR как variant safe array of unsigned
    #39795986
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чет нет идей, как с этим VARIANT из .Net бороться, мутно.
Почитал
VARIANT и SafeArray
Видимо оптимальный вариант, разобрать, осознать (м.б. чуть переделать) C-шный пример
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\fax\faxsecurity
под свои нужды и запускать через Shell.
...
Рейтинг: 0 / 0
Как разбираться с Object в котором SECURITY_DESCRIPTOR как variant safe array of unsigned
    #39800974
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки захотелось сделать по человечески, появилось время и сел этим заниматься.
Как-то так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
 <StructLayout(LayoutKind.Sequential)>
  Private Structure tagVARIANTparray
    Dim vt As Short
    Dim wReserved1 As Short
    Dim wReserved2 As Short
    Dim wReserved3 As Short
    Dim parray As IntPtr
  End Structure

  Public Declare Function SafeArrayAccessData Lib "OleAut32.dll" _
   (ByVal psa As IntPtr, ByRef ppvData As IntPtr) As Integer
  Public Declare Function GetSecurityDescriptorDacl Lib "advapi32.dll" _
   (ByVal pSecurityDescriptor As IntPtr, ByRef lpbDaclPresent As Boolean, ByRef pDacl As IntPtr, ByRef lpbDaclDefaulted As Boolean) As Boolean


Dim g_pSecurityDescriptor As IntPtr 'PSECURITY_DESCRIPTOR*
Dim g_pDACL As IntPtr

Dim objFaxSecurity As FAXCOMEXLib.FaxSecurity = objFaxServer.Security
objFaxSecurity.InformationType = DACL_SECURITY_INFORMATION
Dim objDescriptor As Object = oFaxSecurity.Descriptor
Dim vDescriptor As IntPtr =  Marshal.AllocCoTaskMem(16) ' VARIANT – это 16 байт
Marshal.GetNativeVariantForObject(objDescriptor, vDescriptor)
Dim tV As tagVARIANTparray = CType(Marshal.PtrToStructure(vDescriptor, GetType(tagVARIANTparray)), tagVARIANTparray)
hr = SafeArrayAccessData(tV.parray, g_pSecurityDescriptor)
fFlag = GetSecurityDescriptorDacl(g_pSecurityDescriptor, fDaclPresent, g_pDACL, fDaclDefaulted)
'… <To do>
Marshal.FreeCoTaskMem(vDescriptor)



В общем вытащил я этот VARIANT c .vt=VT_ARRAY из Object и получил искомый g_pDACL… разбираюсь дальше.
Ну, на свой вопрос "Как разбираться?" по крайней мере ответил.

Понять бы куда воткнуть SafeArrayUnAccessData (в SDK-коде нету, но быть должен, но там встречаются ляпы). Смысл в том чтоб не грохнуть то что связано с полученным g_pSecurityDescriptor и g_pDACL раньше времени.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как разбираться с Object в котором SECURITY_DESCRIPTOR как variant safe array of unsigned
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]