powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
12 сообщений из 12, страница 1 из 1
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38843543
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно алгоритм: получаем WellKnownSid, из него читабельное имя группы.
Оно не очевидно, т.е. Administrators на русской системе будет "Администраторы".

API-решение есть
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
  Private Const ERROR_INSUFFICIENT_BUFFER = 122&

  'Well-known SIDs

  ' Identifier authority
  Public Const SECURITY_WORLD_SID_AUTHORITY = &H1 ' S-1-1 A group that includes all users.
  Public Const SECURITY_NT_AUTHORITY = &H5 'S-1-5

  ' Relative identifier authority
  Public Const SECURITY_WORLD_RID = &H0 'S-1-1 A group that includes all users.

  Public Const SECURITY_LOCAL_SYSTEM_RID = &H12 'S-1-5-18 A special account used by the operating system.
  Public Const SECURITY_BUILTIN_DOMAIN_RID = &H20& 'S-1-5-32 The built-in system domain.

  Public Const DOMAIN_ALIAS_RID_ADMINS = &H220& 'A local group used for administration of the domain.
  Public Const DOMAIN_ALIAS_RID_USERS = &H221& 'A local group that represents all users in the domain.

  Public Const DOMAIN_USER_RID_ADMIN = &H1F4 'The administrative user account in a domain.
  Public Const DOMAIN_USER_RID_GUEST = &H1F5 'The guest-user account in a domain. Users who do not have an account can automatically log on to this account.
  Public Const DOMAIN_GROUP_RID_ADMINS = &H200 'The domain administrators' group. This account exists only on systems running server operating systems.


  'Authorization Structures

  <StructLayout(LayoutKind.Sequential)>
  Public Structure SID_IDENTIFIER_AUTHORITY
    <MarshalAs(UnmanagedType.ByValArray, Sizeconst:=6)> Dim Value() As Byte
  End Structure

  'Authorization Functions
  Public Declare Function AllocateAndInitializeSid Lib "advapi32.dll" _
   (ByRef pIdentifierAuthority As SID_IDENTIFIER_AUTHORITY, _
   ByVal nSubAuthorityCount As Byte, ByVal nSubAuthority0 As Integer, _
   ByVal nSubAuthority1 As Integer, ByVal nSubAuthority2 As Integer, _
   ByVal nSubAuthority3 As Integer, ByVal nSubAuthority4 As Integer, _
   ByVal nSubAuthority5 As Integer, ByVal nSubAuthority6 As Integer, _
   ByVal nSubAuthority7 As Integer, ByRef lpPSid As IntPtr) As Boolean
  Public Declare Sub FreeSid Lib "advapi32.dll" (ByVal pSid As IntPtr)
  Public Declare Unicode Function LookupAccountSid Lib "advapi32.dll" _
   Alias "LookupAccountSidW" (ByVal lpSystemName As String, _
   ByVal lpSid As IntPtr, ByVal lpName As String, ByRef cchName As Integer, _
   ByVal lpReferencedDomainName As String, _
   ByRef cchReferencedDomainName As Integer, ByRef peUse As Integer) As Boolean

  Public Function ConstructUniversalAndNTWellKnownSids(GroupName As String) As String
    'возвращает имя стандартной группы пользователей на языке OS (рус,английский)

    ConstructUniversalAndNTWellKnownSids = ""

    Dim siaNtAuthority As New SID_IDENTIFIER_AUTHORITY
    Dim lSid As IntPtr

    Select GroupName
      Case "SYSTEM"
        ' Construct SID for System "NT well-known SID" ("SYSTEM")
        siaNtAuthority.Value = {0, 0, 0, 0, 0, SECURITY_NT_AUTHORITY}
        'siaNtAuthority.Value(5) = SECURITY_NT_AUTHORITY
        If AllocateAndInitializeSid(siaNtAuthority, 1, _
         SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, lSid) Then
          AddLog("  Calling AllocateAndInitializeSid... Done.")
          ' Use the constructed SID in the application
          ConstructUniversalAndNTWellKnownSids = DisplayNameOfSid(lSid)
          ' Free the memory allocated for the SID using FreeSid() API
          FreeSid(lSid)
        Else
          AddLog("  Calling AllocateAndInitializeSid... Failed. Error code: " & RaiseAPIError())
        End If

      Case "Everyone"
        ' Construct SID for Everyone "Universal well-known SID" ("Everyone")
        siaNtAuthority.Value = {0, 0, 0, 0, 0, SECURITY_WORLD_SID_AUTHORITY}
        If AllocateAndInitializeSid(siaNtAuthority, 1, _
         SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, lSid) Then
          AddLog("  Calling AllocateAndInitializeSid... Done.")
          ' Use the constructed SID in the application
          ConstructUniversalAndNTWellKnownSids = DisplayNameOfSid(lSid)
          ' Free the memory allocated for the SID using FreeSid() API
          FreeSid(lSid)
        Else
          AddLog("  Calling AllocateAndInitializeSid... Failed. Error code: " & RaiseAPIError())
        End If

      Case "Administrators"
        ' Construct SID for Administrators "Well-known group" ("Administrators")
        siaNtAuthority.Value = {0, 0, 0, 0, 0, SECURITY_NT_AUTHORITY}
        If AllocateAndInitializeSid(siaNtAuthority, 2, _
         SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, _
         0, 0, 0, 0, 0, 0, lSid) Then
          AddLog("  Calling AllocateAndInitializeSid... Done.")
          ' Use the constructed SID in the application
          ConstructUniversalAndNTWellKnownSids = DisplayNameOfSid(lSid)
          ' Free the memory allocated for the SID using FreeSid() API
          FreeSid(lSid)
        Else
          AddLog("  Calling AllocateAndInitializeSid... Failed. Error code: " & RaiseAPIError())
        End If

      Case "Users"
        ' Construct SID for Users "Well-known group" ("Users")
        siaNtAuthority.Value = {0, 0, 0, 0, 0, SECURITY_NT_AUTHORITY}
        If AllocateAndInitializeSid(siaNtAuthority, 2, _
         SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_USERS, _
         0, 0, 0, 0, 0, 0, lSid) Then
          AddLog("  Calling AllocateAndInitializeSid... Done.")
          ' Use the constructed SID in the application
          ConstructUniversalAndNTWellKnownSids = DisplayNameOfSid(lSid)
          ' Free the memory allocated for the SID using FreeSid() API
          FreeSid(lSid)
        Else
          AddLog("  Calling AllocateAndInitializeSid... Failed. Error code: " & RaiseAPIError())
        End If

      Case Else
    End Select
    If ConstructUniversalAndNTWellKnownSids <> "" Then _
     AddLog("    UsersGroupName: " & ConstructUniversalAndNTWellKnownSids & " ...OK")
  End Function

  Public Function DisplayNameOfSid(ByVal lSid As Long) As String
    ' Helper function to lookup a SID and display the name as a test

    Dim peUse As Integer
    ' Lookup the constructed SID to get the name
    Dim UserName As String = ""
    Dim DomainName As String = ""
    Dim cbUserName As Integer
    Dim cbDomainName As Integer
    'First call to LookupAccountSid to get the buffer sizes.
    If (LookupAccountSid(vbNullString, lSid, UserName, cbUserName, _
     DomainName, cbDomainName, peUse) = False) And (Err.LastDllError <> ERROR_INSUFFICIENT_BUFFER) Then
      AddLog("    Calling LookupAccountSid... Failed. Error code: " & RaiseAPIError())
      DisplayNameOfSid = ""
      Exit Function
    End If
    'Allocate the required space in the UserName and DomainName string
    'variables. Allocate 1 byte less to avoid the appended NULL character.
    UserName = Space(cbUserName - 1)
    DomainName = Space(cbDomainName - 1)
    If LookupAccountSid(vbNullString, lSid, UserName, cbUserName, _
     DomainName, cbDomainName, peUse) Then
      AddLog("    Calling LookupAccountSid... Done.")
      DisplayNameOfSid = UserName
    Else
      AddLog("    Calling LookupAccountSid... Failed. Error code: " & RaiseAPIError())
      DisplayNameOfSid = ""
    End If

  End Function



Код: vbnet
1.
2.
3.
4.
    Debug.Print(ConstructUniversalAndNTWellKnownSids("SYSTEM"))
    Debug.Print(ConstructUniversalAndNTWellKnownSids("Everyone"))
    Debug.Print(ConstructUniversalAndNTWellKnownSids("Administrators"))
    Debug.Print(ConstructUniversalAndNTWellKnownSids("Users"))


Вывод:
Код: vbnet
1.
2.
3.
4.
СИСТЕМА
Все
Администраторы
Пользователи



Но хочется получить то же самое через .Net

У меня получилось высечь только слово "Все":
Код: vbnet
1.
2.
    Dim sid As SecurityIdentifier = New SecurityIdentifier(WellKnownSidType.WorldSid, Nothing)
    MsgBox(sid.Translate(GetType(NTAccount)).ToString)


Соответствует SECURITY_WORLD_SID_AUTHORITY+SECURITY_WORLD_RID

Для Администраторы и Пользователи по логике надо сгенерировать
WellKnownSidType.AccountDomainAdminsSid
WellKnownSidType.AccountDomainUsersSid
но у меня нет идей что лепить во второй параметр.
Администраторы: SECURITY_NT_AUTHORITY+SECURITY_BUILTIN_DOMAIN_RID+DOMAIN_ALIAS_RID_ADMINS
Пользователи:SECURITY_NT_AUTHORITY+SECURITY_BUILTIN_DOMAIN_RID+DOMAIN_ALIAS_RID_USERS

Ну и не знаю как бодаться с "СИСТЕМА":
Соответствует SECURITY_NT_AUTHORITY+SECURITY_LOCAL_SYSTEM_RID

Поможете?
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38843822
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38843894
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

но ваш код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
    For Each s As WellKnownSidType In [Enum].GetValues(GetType(WellKnownSidType))
      Try
        Debug.WriteLine(New SecurityIdentifier(s, Nothing).Translate(GetType(NTAccount)).Value)
      Catch

      End Try
    Next


он же ошибается через раз, и он не прокатывает именно для AccountDomainAdminsSid и AccountDomainUsersSid, потому что там второй параметр не нуль, а хз что если на .Net - языке.

В принципе мне нужно то думаю вот это:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    Debug.WriteLine(New SecurityIdentifier(WellKnownSidType.LocalSystemSid, Nothing).Translate(GetType(NTAccount)).Value)
    Debug.WriteLine(New SecurityIdentifier(WellKnownSidType.WorldSid, Nothing).Translate(GetType(NTAccount)).Value)
    Debug.WriteLine(New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing).Translate(GetType(NTAccount)).Value)
    Debug.WriteLine(New SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, Nothing).Translate(GetType(NTAccount)).Value)

Вывод:

NT AUTHORITY\СИСТЕМА
Все
BUILTIN\Администраторы
BUILTIN\Пользователи



Смущает некоторое несоответствие с API-вариантом, но подозреваю что там не совсем правильно.
Т.е. эти алиасы нужны не для красного словца а для проверки/назначения прав в DACL - таблицах.
И подозреваю что именно эти алиасы как раз правильные, а не DOMAIN_GROUP_RID_ADMINS/DOMAIN_ALIAS_RID_USERS

И по идее, начал счас копаться, sid-а в принципе достаточно чтобы вычленить правильную DACL запись из набора rules (и sid как раз не имеет языковой подоплеки).
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844144
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77он же ошибается через раз, и он не прокатывает именно для AccountDomainAdminsSid и AccountDomainUsersSid, потому что там второй параметр не нуль, а хз что если на .Net - языке.
Ну он не может, значит, транслировать это.

Дмитрий77Вывод:
NT AUTHORITY\СИСТЕМА
Все
BUILTIN\Администраторы
BUILTIN\Пользователи
Ну так это и требовалось. Разве не так?
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844169
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Ну наверно правильно.
Хотя API (под спойлером в первом посте) выводят без приставок BUILTIN\ и NT AUTHORITY\, но они и берут не совсем из того места.

Ты если в этой кухне разбираешься, сюда 17059241 не глянешь? Хоть убей, не могу владельца через .Net сменить.
Ветка реестра хитрая, у администратора нет прав на ее изменение, ему надо эти права дать - для этого сначала назначить его владельцем.

Что не так делаю? И можно ли там без API вообще обойтись. По логике описания .Net класса можно,
но он с RegistryRights.TakeOwnership по дефолту даже ветку открыть не дает.

Близок уже к тому чтоб эту всю кухню на чистых API оставить.
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844174
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ты если в этой кухне разбираешься, сюда 17059241 не глянешь?
Тема углублённая, с ходу так что-то посоветовать сложно. Нужно поднимать тестовую среду, отлаживать код, искать варианты, разбираться более глубоко. А разбираться в таком, находясь в отпуске, у меня нет особого желания, уж прости :)
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844187
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

ну нет так нет.

Но у меня возникло ощущение, что .Net не умеет сменить владельца если нет общих прав на запись ветки.
И привелегию SE_TAKE_OWNERSHIP_NAME на hToken процесса .Net не может установить.
Я его попытался "подпихнуть" через API, но бесполезно.
Мне то надо только поменять только OWNER_SECURITY_INFORMATION, а
А SetAccessControl по ходу всю таблицу DACL-ов пытается переписать, а прав на это нету.

И сдается мне надо здесь забить на .Net реализацию и импортировать API-шный отлпаженный код, причем полностью.
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844202
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, ну если апи работают, забей на .net, не критично.
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844207
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУДмитрий77, ну если апи работают, забей на .net, не критично.

НЕ попадайся на удочку, вступая в дискуссию с этим саморефлексирующим типом.
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844208
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, конкретнее по теме )
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844210
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, соседняя ветка?
...
Рейтинг: 0 / 0
Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
    #38844212
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАга, соседняя ветка?

Ему другие люди очень мешают дискутировать самому с собой )
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получить имена стандартных групп пользователей:Администраторы, Все, СИСТЕМА, Пользователи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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