Управление удаленными списками DACL на файловых ресурсах: от Win32_ACE до Win32_Share

Цель: добавить разрешения на чтение и запись на уровне общего доступа для локальной учетной записи пользователя к существующему общему файловому ресурсу.

Я сталкиваюсь с препятствием в разработке этого. Очевидно, Microsoft хочет, чтобы вы добавили ACE вашего пользователя в DACL, а затем обратно в дескриптор безопасности общего ресурса. (1). (Нет, NET SHARE /ADD недоступен для существующих общих ресурсов, я был удивлен.)

Теоретически это должно быть достаточно просто, но больше всего я боюсь сделать это неправильно и потерять существующие разрешения на общий доступ (множество сетевых пользователей, определенные группы). Это решение необходимо масштабировать до нескольких тысяч акций. Я разрабатываю решение для вывода данных о существующем DACL на случай, если мне нужно будет отказаться. Я должен написать код для интерпретации этого журнала и быть готовым добавить их обратно в массовом порядке, если что-то пойдет не так.

На данный момент я использую VBscript — я чувствую, что PowerShell может быть немного более сильным подходом, но VBscript/WMI — известная величина.

Исследования: (1) http://blogs.msdn.com/b/helloworld/archive/2008/07/22/editing-share-permission.aspx


person Christopher W. Moriarty    schedule 11.11.2012    source источник


Ответы (1)


Скопируйте существующие ACE в массив:

rc = shareSec.GetSecurityDescriptor(sd)
ReDim acl(UBound(sd.DACL)+1)  '+1 for the new ACL we're going to add
For i = 0 To UBound(sd.DACL)
  Set acl(i) = sd.DACL(i)
Next

Добавьте новый ACE в этот массив:

Set acl(UBound(acl)) = NewACE(NewTrustee(username, domain), 2032127)

Функции NewTrustee() и NewACE() содержат инструкции по созданию доверенного лица и ACE. Это число является маской доступа для Полный доступ.

Создайте новый дескриптор безопасности и назначьте его общему ресурсу:

Set sd = wmi.Get("Win32_SecurityDescriptor").SpawnInstance_
sd.ControlFlags = flags
sd.DACL = acl
rc = shareSec.SetSecurityDescriptor(sd)

Проверьте эта страница для более подробной информации об дескрипторах безопасности, доверенных лицах, ACL и ACE.


Полный сценарий:

Const FullControl = 2032127

' modify these variables according to your requirements:
computer = "."
share    = "..."
username = "..."
domain   = CreateObject("WScript.Network").UserDomain

Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!//" _
  & computer & "/root/cimv2")
Set shareSec = GetObject("winmgmts:Win32_LogicalShareSecuritySetting.Name='" _
  & share & "'")

Function NewTrustee(name, domain)
  Dim trustee, account

  Set trustee = wmi.Get("Win32_Trustee").SpawnInstance_
  trustee.Name   = name
  trustee.Domain = domain
  Set account = wmi.Get("Win32_UserAccount.Domain='" & domain & "',Name='" _
    & name & "'")
  trustee.Properties_.Item("SID") = wmi.Get("Win32_SID.SID='" & account.SID _
    & "'").BinaryRepresentation

  Set NewTrustee = trustee
End Function

Function NewACE(trustee, permissions)
  Dim ace : Set ace = wmi.Get("Win32_Ace").SpawnInstance_
  ace.Properties_.Item("AccessMask") = permissions
  ace.Properties_.Item("AceFlags") = 3
  ace.Properties_.Item("AceType") = 0
  ace.Properties_.Item("Trustee") = trustee
  Set NewACE = ace
End Function

' copy existing ACEs
rc = shareSec.GetSecurityDescriptor(sd)
flags = sd.ControlFlags
ReDim acl(UBound(sd.DACL)+1)  '+1 for the new ACL we're going to add
For i = 0 To UBound(sd.DACL)
  Set acl(i) = sd.DACL(i)
Next
Set sd = Nothing

' add new ACE
Set acl(UBound(acl)) = NewACE(NewTrustee(username, domain), FullControl)

' prepare new security descriptor
Set sd = wmi.Get("Win32_SecurityDescriptor").SpawnInstance_
sd.ControlFlags = flags
sd.DACL = acl

' assign new security descriptor
rc = shareSec.SetSecurityDescriptor(sd)
person Ansgar Wiechers    schedule 12.11.2012