プロパティのセキュリティから詳細設定を開いたところに表示されるユーザーの「継承元」の部分です。
フォルダを指定すると、そこに許可されているユーザー名と継承元が分かるようなものだと嬉しいです。
一応、先の質問の関連です。
http://q.hatena.ne.jp/1210746433
作ってみました。
親オブジェクトから継承されていない(SE_DACL_PROTECTEDがセットされていない)フォルダに到達するまで1つずつフォルダをたどっていきます。
継承元のフォルダに辿り着いたら、GetSecurityDescriptorメソッドでユーザー名などの詳細を取得します。
Const SE_DACL_PROTECTED = &h1000 On Error Resume Next If WScript.Arguments.Count = 0 Then WScript.Echo "引数にパスを指定してください" WScript.Quit End If TargetPath = WScript.Arguments.Item(0) Set fso = CreateObject("Scripting.FileSystemObject") TargetPath = fso.GetFolder(TargetPath).Path WScript.Echo "対象パス: " & TargetPath CurrentPath = "" Do If CurrentPath = "" Then CurrentPath = TargetPath Else Err = 0 ' 1つ上のフォルダを取得 CurrentPath = fso.GetFolder(CurrentPath).ParentFolder If Err <> 0 Then ' ルートに到達 Exit Do End If End If Set wmiFileSecSetting = GetObject( _ "winmgmts:Win32_LogicalFileSecuritySetting.path='" & _ CurrentPath & "'") Loop Until (wmiFileSecSetting.ControlFlags And SE_DACL_PROTECTED) <> 0 WScript.Echo "継承元パス: " & CurrentPath Err = 0 RetVal = wmiFileSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor) If Err <> 0 Then WScript.Echo "GetSecurityDescriptor 失敗" & _ vbCrLf & Err.Number & vbCrLf & Err.Description WScript.Quit End If WScript.Echo WScript.Echo "アクセス制御リスト:" For Each wmiAce in wmiSecurityDescriptor.DACL WScript.Echo " " & wmiAce.Trustee.Name Next
参考:
Win32_LogicalFileSecuritySetting Class (Windows)
GetSecurityDescriptor Method of the Win32_LogicalFileSecuritySetting Class (Windows)
回答ありがとうございます!
スクリプトまで書いていただきすいません。
確認してみました。
継承元を追えるのでかなり便利なのですが、継承元が複数ある時にも一つのフォルダしか出ません。
たとえば、各ユーザの継承元が
userA→C:\hoge
userB→C:\hoge
userC→C:\hoge\hogehoge
となった状態で子に継承されている場合に、c:\hogeは表示されるのですが、c:\hoge\hogehogeは出ないといった具合です。
今回のチェックの目的は、継承元を拾いたいというのもあるのですが、それよりも、継承のないユーザがいるフォルダを見つけたいということがあります。
たとえば
c:\hoge 以下のサブフォルダにアクセス権の継承をしていている状態で、
c:\hoge\hoge2\hoge3 に継承なしのユーザが追加されている場合、その\hoge3フォルダを見つけたいのです。
質問の内容とは少し違ったというものの、このスクリプトは大変参考になりそうです。
ほんとにありがとうございます。
WMIやVBSに関しては全く無知ですので、コメント欄もとても参考になります。
ポイントを差し上げたいのでぜひ回答欄にも書いていただけたらと思います。
引き続き回答お待ちしております。