• ベストアンサー

共有フォルダの「共有のアクセス許可」を設定するコマンド

こんにちは。 OSはWindows2000 Proです。 共有フォルダを作成し、NTFSのアクセス権を caclsコマンドで一括変更する処理は可能です が、共有タブにあるアクセス許可で、同じよう にアクセス権を変更するバッチファイルを作成 したいのですが、どのようなコマンドを使用す ればよろしいでしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ittochan
  • ベストアンサー率64% (2667/4137)
回答No.4

ANo.#2には問題があったので 書き直しました。 Option Explicit Dim Services Dim SecDescClass Dim SecDesc Dim Trustee Dim ACE1 Dim ACE2 Dim Share Dim InParam Const FolderName = "C:\public" Const ImpLevel = "{impersonationLevel=impersonate}" Const namespace = "!root\cimv2:" Const ComputerName = "ittochan" Const ShareName = "Pubs" Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!\\.\ROOT\CIMV2") Set SecDescClass = Services.Get("Win32_SecurityDescriptor") Set SecDesc = SecDescClass.SpawnInstance_() Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_ Trustee.Domain = Null Trustee.Name = "Administrators" Trustee.Sid = getSID(Trustee.Name) Set ACE1 = Services.Get("Win32_Ace").SpawnInstance_ ACE1.AccessMask = 2032127 ACE1.AceFlags = 3 ACE1.AceType = 0 ACE1.Trustee = Trustee Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_ Trustee.Domain = ComputerName Trustee.Name = "Everyone" Trustee.SID = getSID(Trustee.Name) Set ACE2 = Services.Get("Win32_Ace").SpawnInstance_ ACE2.AccessMask = 2032127 ACE2.AceFlags = 3 ACE2.AceType = 0 ACE2.Trustee = Trustee ' SecDesc.DACL = Array(ACE1,ACE2) Set Share = Services.Get("Win32_Share") Set InParam = Share.Methods_("Create").InParameters.SpawnInstance_() InParam.Properties_.Item("Access") = SecDesc InParam.Properties_.Item("Description") = "Public Share" InParam.Properties_.Item("Name") = ShareName InParam.Properties_.Item("Path") = FolderName InParam.Properties_.Item("Type") = 0 InParam.Properties_.Item("MaximumAllowed") = 5 Share.ExecMethod_ "Create", InParam WScript.Quit function getSID(ByVal strUserName) dim objWMIService dim colAccount , colItems , objItem dim ClasSID , strMoniker , strSID , obj dim instance Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set colAccount = objWMIService.ExecQuery( _ "Select * from Win32_Account where name='" & strUserName & "'") for each obj in colAccount if LCase(obj.name)=LCase(strUserName) then strSID = obj.SID end if next if strSID="" then WScript.Echo strUserName & "というユーザー名または、グループ名が見つかりません" WScript.Echo "失敗しました" WScript.Quit else strMoniker = "winmgmts:" & ImpLevel & namespace & _ "Win32_SID.SID='" & strSID & "'" Set instance = GetObject(strMoniker) getSID=instance.BinaryRepresentation end if end function

その他の回答 (3)

  • ittochan
  • ベストアンサー率64% (2667/4137)
回答No.3

実は 「WSH(VBScript)で共有フォルダを作成したい」の件で 後日色々調べてみたんです。 あの時、 『WSHにはアクセス許可の編集機能は無いと思うので』 って書いたことを後悔していたんですが、 タイミングよくenakoさんが質問してくれてよかったです。 もちろんローカルのアクセス許可も編集可能です。

  • ittochan
  • ベストアンサー率64% (2667/4137)
回答No.2

できました。 完成版を書きますね。 '既存の共有フォルダのアクセス許可にユーザーを追加 Option Explicit Dim i,j Dim FSO Dim Services Dim SecDescClass Dim SecDesc dim wmiAce dim wmiTrustee Dim Trustee Dim ACE Dim Trustee1 Dim ACE1 dim strMoniker dim wmiShareSecSetting dim RetVal Dim DACL Dim controlFlags Dim accessmask Dim Group Dim Owner Dim SACL Dim number_of_trustees Dim trustee_Domain Dim trustee_Name Dim trustee_Sidstring Dim strACL Dim wmiSecurityDescriptor dim strSID '' アクセス権のマスク Const FULLACCESS = 2032127 '' フルアクセス(All) Const READ = 1179817 '' 読み取り(RX) Const UPDATE = 1245631 '' 変更(RWXD) Const ComputerName = "ittochan" Const ShareName = "Pubs" Const ImpLevel = "{impersonationLevel=impersonate}" Const namespace = "!root\cimv2:" Const objectpath = _ "Win32_LogicalShareSecuritySetting=""Pubs""" strMoniker = "winmgmts:" & ImpLevel & namespace & objectpath Set wmiShareSecSetting = GetObject (strMoniker) '' セキュリティディスクリプタを取得し、wmiSecurityDescriptorに格納する。 RetVal = wmiShareSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor) If Err <> 0 Then WScript.Echo "GetSecurityDescriptor failed" & VBCRLF & Err.Number & VBCRLF & Err.Description WScript.Quit Else WScript.Echo "GetSecurityDescriptor suceeded" End If '' セキュリティディスクリプタから情報を取得する。 DACL = wmiSecurityDescriptor.DACL ' get dacl DispDACL Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!" & "\\" & ComputerName & "\ROOT\CIMV2") '既存のACLを上書きする j=0 For each wmiAce in DACL Set ACE = Services.Get("Win32_Ace").SpawnInstance_ Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_ Set wmiTrustee = wmiAce.Trustee Trustee.Domain = wmiTrustee.Domain Trustee.Name = wmiTrustee.Name Trustee.SID = wmiTrustee.SID ACE.AccessMask = wmiAce.AccessMask ' 'Everyoneのアクセス権をフルアクセスに変更する ' if Trustee.Name="Everyone" then ' ACE.AccessMask = FULLACCESS ' end if ACE.AceFlags = wmiAce.AceFlags ACE.AceType = wmiAce.AceType ACE.Trustee = Trustee wmiSecurityDescriptor.DACL(j) = ACE j=j+1 Next '新しいACLを作成 Set ACE = Services.Get("Win32_Ace").SpawnInstance_ Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_ Trustee.Domain = ComputerName Trustee.Name = "Administrator" Trustee.Sidstring = getSID(Trustee.Name) ACE.AccessMask = READ ACE.AceFlags = 3 ACE.AceType = 0 ACE.Trustee = Trustee 'DACLに追加する wmiSecurityDescriptor.DACL(j) = ACE retval = wmiShareSecSetting.setsecuritydescriptor(wmiSecurityDescriptor) If retval = 0 Then WScript.Echo "成功しました。" WScript.Echo "" DispDACL Else WScript.Echo "セキュリティ設定を変更できませんでした。" End If Set wmiShareSecSetting = Nothing WSCript.Quit sub DispDACL() Set wmiShareSecSetting = GetObject (strMoniker) '' セキュリティディスクリプタを取得し、wmiSecurityDescriptorに格納する。 RetVal = wmiShareSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor) '' セキュリティディスクリプタから情報を取得する。 DACL = wmiSecurityDescriptor.DACL ' get dacl For each wmiAce in DACL Set wmiTrustee = wmiAce.Trustee strSID="" For i = 0 To UBound(wmiTrustee.SID) - 1 strSID = strSID & wmiTrustee.SID(i) & "," Next strSID = strSID & wmiTrustee.SID(i) 'アクセスマスクの取得 accessmask = wmiAce.AccessMask ' Save the accessmask ' アクセスマスクをアクセス権表示文字列に変換する。 Select Case accessmask Case FULLACCESS strACL = "フルコントロール(All)" Case READ strACL = "読み取り(RX)" Case UPDATE strACL = "変更(RWXD)" Case Else strACL = accessmask End Select WScript.Echo "Domain:" & wmiTrustee.Domain & vbNewLine _ & "Name:" & wmiTrustee.Name & vbNewLine _ & "SID:" & strsid & vbNewLine _ & "Sidstring:" & wmiTrustee.Sidstring & vbNewLine _ & "ACL:" & strACL & vbNewLine _ & "AccessMask:" & accessmask Next end sub function getSID(ByVal strUserName) dim objWMIService dim colUserAccount dim colGroup dim obj Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set colUserAccount = objWMIService.ExecQuery("Select * from Win32_UserAccount") for each obj in colUserAccount if LCase(obj.name)=LCase(strUserName) then getSID = obj.SID exit function end if next Set colGroup = objWMIService.ExecQuery("Select * from Win32_Group") for each obj in colGroup if LCase(obj.name)=LCase(strUserName) then getSID = obj.SID exit function end if next WScript.Echo strUserName & "というユーザー名または、グループ名が見つかりません" WScript.Echo "失敗しました" WScript.Quit

enako
質問者

お礼

ittochanさん、こんにちは。 更なる「大作」をありがとうございます。 やはり、WSHは奥が深いことを思い知ら されました。時間がかかりそうですが、 必ずやこのスクリプトを自分のものに してみせます! どうもありがとうございました。

  • ittochan
  • ベストアンサー率64% (2667/4137)
回答No.1

WindowsXP+WSH+WMI を使用したVBScriptでしたら可能です。 多分Windows2000でも動くでしょう。 ↓は C:\Publicフォルダを新規作成し、 共有フォルダPubsとして構成、 共有フォルダのアクセス許可リストに フルコントロールのEveryoneを追加しています。 他のユーザーの追加方法はいまのところ分かりません。 すでにアクセス許可リストに登録されているユーザーなら変更することが可能なんですが・・・・ Option Explicit Dim FSO Dim Services Dim SecDescClass Dim SecDesc Dim Trustee Dim ACE Dim Share Dim InParam Dim Network Const FolderName = "C:\Public" Const ComputerName = "ittochan" Const ShareName = "Pubs" Set FSO = CreateObject("Scripting.FileSystemObject") If Not FSO.FolderExists(FolderName) Then FSO.CreateFolder(FolderName) End If Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!" & "\\" & ComputerName & "\ROOT\CIMV2") Set SecDescClass = Services.Get("Win32_SecurityDescriptor") Set SecDesc = SecDescClass.SpawnInstance_() Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_ Trustee.Domain = ComputerName Trustee.Name = "EVERYONE" Trustee.Properties_.Item("SID") = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0) Set ACE = Services.Get("Win32_Ace").SpawnInstance_ ACE.Properties_.Item("AccessMask") = 2032127 ACE.Properties_.Item("AceFlags") = 3 ACE.Properties_.Item("AceType") = 0 ACE.Properties_.Item("Trustee") = Trustee SecDesc.Properties_.Item("DACL") = Array(ACE) Set Share = Services.Get("Win32_Share") Set InParam = Share.Methods_("Create").InParameters.SpawnInstance_() InParam.Properties_.Item("Access") = SecDesc InParam.Properties_.Item("Description") = "Public Share" InParam.Properties_.Item("Name") = ShareName InParam.Properties_.Item("Path") = FolderName InParam.Properties_.Item("Type") = 0 Share.ExecMethod_ "Create", InParam

enako
質問者

お礼

ittochanさん、こんにちは。 私にとって大作をどうもありがとうございます。 一筋縄ではいかないようですが、じっくり研究 し解読してみようと思います。 どうもありがとうございました。

関連するQ&A