• ベストアンサー

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

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

  • enako
  • お礼率62% (298/476)

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

  • ベストアンサー
  • 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

  • 共有フォルダーのアクセス者

    教えて下さい。 各サーバの共有されているフォルダーのアクセス利用者の一覧を 作成しようとしているのですが"net share" や"cacls"では フォルダーのプロパティで言うところの 『セキュリティー』-【アクセス者】の表示がされて 『共有』-【アクセス許可】されている人の分までが表示されません。 『共有』の【アクセス許可】されている人を表示させるにはどういう コマンドにすればよろしいのでしょうか? 共有フォルダーが多数ある為、ファイルとして出力したいのですが。 OSはWindows2000を使用しております。

  • フォルダ共有化

    フォルダ共有化を自動化させるbatプログラムを作成中です。 ですがうまくいかない点がありますので質問させて下さい。 以下に作成したbatプログラムです。 ---ここから--------- cacls e:\てすと /G win95:R  ←(1) net share てすと=e:\てすと  ←(2) ---ここまで--------- (1)で共有化させるフォルダに共有させたいユーザー(win95)  権限を与えます。 (2)でフォルダを共有させます。 ここで問題が2つ ・caclsコマンドはコマンド実行確認を問合せてくる。  そのたびにbatが止まってしまう。デフォルトで  "Y"としたい。 ・(2)で指定したフォルダは共有出来るのですが  共有のアクセス許可がデフォルト(everyone)のまま。  (1)で指定しているユーザー(win95)を反映させたい。 以上、よろしくお願いします。

  • 共有アクセス許可のEveryoneについて

    こんにちは。 共有アクセス許可のEveryoneについて教えてください。 環境はWindows2000Serverです。 フォルダを共有すると、共有アクセス許可の所にデフォルトでEveryoneのフルコンが設定されると思います。これは、削除した方が良いのでしょうか? 残している場合、どのような問題が起きますか? 現在の設定は、共有アクセス許可の所はデフォルトのままで、NTFSのセキュリティでグループを追加してアクセス権設定をしています。 (NTFSセキュリティの方のEveryoneは外してあります。) よろしくお願いします。

  • Win2000server 共有フォルダ

    MCPの215の勉強しています。共有フォルダのアクセス許可について質問です。 「test1のフォルダにサブフォルダtest2がある場合、test1に共有アクセス許可、tanaka:読み取り、satou:フルコン、NTFS許可tanaka:フルコン、satou:フルコン test2に共有アクセス許可:共有されてない、NTFS許可tanaka:フルコン、satou:フルコンが設定さている。 tanakaグループにtest2フォルダに対するフルコンを与え、satouグループにtest2フォルダに対する読み取りを与えたい、test1フォルダについてはどちらのグループ許可も変更したくない、何をするのか?」の問題でtest1フォルダの共有許可をtanakaグループのフルコンに変更、test1フォルダのNTFSアクセス許可をtanakaグループの読み取りにする、test2フォルダのNTFSアクセス許可をHRグループの読み取り許可にする。 とあります。アクセス許可は共有アクセス許可とNTFSアクセス許可が重複したとき、NTFS許可が設定されると思っていたのですが・・・誰か、初心者にも解るように教えてください。

  • 共有フォルダが見えるがアクセスできない!

    今まで問題なくアクセスできていた共有フォルダが、突然アクセスできなくなりました。心当たりのある変化点は、今日Norton AntiVirus 2007のLive Updateを実行して再起動した後からそうなったことです。 環境は以下のとおりです。 (A)のパソコン  ・Windows XP Homeのノートパソコン  ・ノートパソコン内蔵の(C)(D)ドライブあり  ・ノートパソコンにUSB2.0で接続された外付けHD(X)(Y)ドライブあり  ・(D)ドライブに共有フォルダ「共有1」  ・(X)ドライブに共有フォルダ「共有2」 (B)のパソコン  ・Windows XP Homeのデスクトップパソコン  ・デスクトップパソコン内蔵の(C)(D)ドライブあり いつも(B)のパソコンから「共有1」と「共有2」のフォルダをアクセスしていました。昨日までは全く問題なくアクセスできていましたが、 今日突然、  ・(D)ドライブの「共有1」→いままで通り問題なくアクセス可能  ・(X)ドライブの「共有2」   →「このネットワークリソースを使用するアクセス許可がない     可能性があります。アクセス許可があるかどうかこのサー     バーの管理者に問い合わせてください。このコマンドを処     理するのに必要な記憶域をサーバーで確保できません。」    というメッセージが出てアクセスできない。 というように、「共有2」のみアクセスできなくなってしまいました。 フォルダのプロパティなどは全くいじっていません。 また、ためしに(X)ドライブに新たな共有フォルダ「共有3」を作成して(B)のパソコンからアクセスしようとしましたが、「共有2」と同様のメッセージが出てアクセスできなくなりました。同じことを(Y)ドライブについてもやってみましたが、同じくアクセスできません。 どうやら、(A)パソコン内蔵の(C)(D)ドライブの共有フォルダはアクセスできるが、(A)パソコンの外付けHDの(X)(Y)ドライブにはアクセスできないという症状のようです。共有フォルダはすべて、プロパティの  ・「共有タブ」の「ネットワーク上での共有とセキュリティ」は    両方チェック有り  ・「セキュリティタブ」の設定は同じ なのですが、なぜか外付けHDの共有フォルダにはアクセスできません。 (繰り返しますが、今までは問題なくアクセスできていたのに、突然できなくなりました) どなたか対処方法を教えてください。

  • フォルダのアクセス権確認について

    Windows Server 2003向けのバッチの処理の中で、 フォルダの権限チェックを行うことを考えています。 (1)チェック対象フォルダのアクセス権にDomain Adminsの権限があるかどうかを確認する。 (2)なければエラーと返す。(エラーメッセージを出力) という処理をバッチの中に組み込みたいのです。 cacls、xcacls辺りのコマンドでできそうな気がしているのですが、 権限があるか否かだけを確認する方法がわかりません。 よろしくお願いします。

  • 共有のアクセス許可のユーザー追加について

     ネットワークを使ってフォルダを共有する際に、ユーザー毎にアクセス許可を設定したいと思っています。  共有したいフォルダの「共有とセキュリティ」→「共有タブ」→「アクセス許可」→「追加」と進み、「ユーザーまたはグループの選択」でネットワーク上のユーザーを追加したいのですが、「場所」の欄に自分のコンピュータしか表示されず、他のユーザーの追加ができません。  共有フォルダはXP Pro上にあります。  ネットワークからアクセスしたいのは、XP Home と2000です。   現在は「Everyone」に読み取りのみ許可をしています。この状態ではWorkgroup上にはお互いのコンピュータが見えており、共有フォルダの読み取りができます。  以前、簡易共有を使用して共有していたらウィルスを投げ込まれた事があり、また、共有フォルダがあるXP Proは会社に持って行って使用する事もあるので、何らかの制限をしたいのです。  解決方法をご存知の方、すみませんが宜しくお願いします。

  • 共有ファイルやフォルダーにアクセスできなくなりました

    共有ファイルやフォルダーにアクセスできなくなりました。(共有フォルダーは見える) 「×××にアクセスできません。このネットワークリソースを使用するアクセス許可がない可能性があります。アクセス許可があるかどうかこのサーバーの管理者に問い合わせてください。このコマンドを処理するのに必要な記憶域をサーバーで確保できません。」とメッセージが出て、このサイトでいろいろやってみましたがダメでした。 1NetBIOS overTCP/IPを有効にする。 2ComputerBrowserサービスを開始する。 3restrictanonymousの確認 以上はやってみました。

  • 共有フォルダにアクセス(2)

    前回https://okwave.jp/qa/q9888695.htmlの続きです。 Wi-Fiルータに2台のPC接続してます。それぞれに共有フォルダ作成しました。PCはWindows10、Windows7です。 質問; Windows7エクスプローラのネットワークからWindow10のIPアドレスでアクセスすると「・・・に対するアクセス許可がありません。ネットワーク管理者にアクセス許可を要求してください。」となりアクセスできません。逆にWindows10からwindows7の共有フォルダにはアクセスできます。原因調査いろいろやってみましたが状況変わりません。解決方法お願いします。

  • Win7 外付けHDD共有時のアクセス権限問題

    このたびはお世話になります。 以下の環境下で外付けHDDを共有設定しているのですが、 権限があるにもかかわらず何故かファイルを作成することができません。 ※「この操作を実行するアクセス許可が必要です。」とメッセージが出ます。 ※共有フォルダへのアクセス・ファイルを開くことはできます。 ※Windowsから共有フォルダのアクセス権限を確認すると、  書き込み権限は正常に付与されておりました。 ・クライアントPCはWin7Pro 32bit ・起動時にタスクマネージャでバッチを起動し、外付けHDDを共有(net share)してます。 ・上記バッチにはアクセス権を制御するため以下の内容を記載しております。  変更権限追加(変更権限=C)  cacls E:\ /E /P ドメイン名\ユーザー名:C    "Everyone"のアクセス権削除  cacls E:\ /E /R Everyone  "Users"のアクセス権削除  cacls E:\ /E /R Users  ※特定の人物のみアクセス可能にするために実行しております。 権限の通りにファイルへのアクセス権限を付与したいのですが、 どのように対応すればよいでしょうか? お手数をおかけしますが、ご教授ください。

専門家に質問してみよう