2

目標: ローカル ユーザー アカウントの共有レベルの読み取り/書き込みアクセス許可を既存のファイル共有に追加します。

私はこれを開発する上で障害にぶつかっています。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

4

1 に答える 1

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 を作成するための命令をカプセル化します。数字はFull Controlのアクセス マスクです。

新しいセキュリティ記述子を作成し、共有に割り当てます。

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)
于 2012-11-12T09:50:44.777 に答える