これは2005年に投稿したエントリーで、以前のブログから引き継いだものです。
一度、キーワード的なクラスが見つかってしまえば苦労しないのですが、なかなか情報が見つからなくて苦労しました。まず参考にしたのは以下のページ。
https://web.archive.org/web/20030904210630/http://www.users.gr.jp/ml/Archive/viewer.aspx?name=wsh&no=130
- Subject:General Permission notes
- GetSecurityDescriptor Method of the Win32_LogicalFileSecuritySetting Class
まず、クラスのインスタンス化はこんな感じです。
set myWMI = getObject("winmgmts:[computer name]\root\cimv2:Win32_LogicalFileSecuritySetting=[path]";)
インスタンス化したオブジェクトにはpathというプロパティが付属しているので、後から参照パスを変更することも可能です。まとめるとこんな具合。
set myWMI = getObject("winmgmts:\root\cimv2:Win32_LogicalFileSecuritySetting='c:\temp'";) msgbox "now, looking at " & myWMI.path myWMI.path = "c:\test" msgbox "now, looling at " & myWMI.path
オーナーを参照するには、getSecurityDescriptorを実行します。コードにするとこんな感じです。
if myWMI.getSecurityDescriptor(mySD) = 0 then set myOwner = mySD.owner msgbox myWMI.path & " is owned by " & myOwner.name end if
mySDにオブジェクトSecurityDescriptorが指定され、そのサブ・オブジェクトであるOwnerを参照することで、オーナー情報を参照できます。
さらにサブ・オブジェクトDACL(Discretionary Access Control List)を参照することで、参照権限を持つグループ、アカウントが一覧できます。コードはこんな感じ。
for each myACE in mySD.dacl msgbox myACE.trustee.name next
参照できるかどうかを確認する際にもDACLを参照します。プロパティ、AceTypeが0なら参照可能、1なら参照不可です。
for each myACE in mySD.dacl select case myAce.AceType case 0 msgbox "access allowed" case 1 msgbox "access denied" case else msgbox "unknown" end select next
細かい参照権限に関しては細かいビット計算を伴います。その詳細は上記ハイパー・リンクを参照いただくとして、ここでは計算の経過はおいて、簡潔に結果だけを紹介。プロパティ、AccessMaskの値から参照権限を判断します。具体的には
- フル・コントロール: 2032127
- 変更: 1245631
- 読み取り: 1179817
for each myACE in mySD.dacl select case myAce.AccessMask case 2032127 msgbox "full control" case 1245631 msgbox "modify" case 1179817 msgbox "read only" case else msgbox "others" end select next
最後にその参照権限が配下のオブジェクトへ継承されているのかどうかを確認です。プロパティ、AceFlagsを確認します。またもビット計算が伴います。その値と詳細に関しては、再度、上記ハイパー・リンクを確認していただくとして、ここではコードだけ紹介。こんな感じです。正直なところ、混乱してきました。
for each myACE in mySD.dacl if myAce.AceFlags and 1 then msgbox "non-containers will inherit and pass on"; end if if myAce.AceFlags and 2 then msgbox "containers will inherit and pass on" end if if myAce.AceFlags and 3 then msgbox "containers and non-containers will inherit and pass on" end if next
より有用なページ、簡潔なページをご存知の方、情報提供お待ちしております。
VBScriptでフォルダの参照権限を参照する。Vol.2では実際にフォルダの参照権限を変更してみます。