Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

VBScriptでフォルダの参照権限を参照する。Vol.1

これは2005年に投稿したエントリーで、以前のブログから引き継いだものです。

一度、キーワード的なクラスが見つかってしまえば苦労しないのですが、なかなか情報が見つからなくて苦労しました。まず参考にしたのは以下のページ。
https://web.archive.org/web/20030904210630/http://www.users.gr.jp/ml/Archive/viewer.aspx?name=wsh&no=130

  1. [WSH:00130] Re: WMI で cacls コマンドは実現できる ?
  2. 質問:共有フォルダの「共有のアクセス許可」を設定するコマンド
これらからキーワードを見つけてたどり着いたのが以下のページ。
  1. Subject:General Permission notes
  2. GetSecurityDescriptor Method of the Win32_LogicalFileSecuritySetting Class
英語のドキュメントでは有りますが、特に前者が簡潔にまとまっていて有用です。例によってWMIを利用します。前者の内容を簡潔にまとめてみました。まずは参照権限を参照するところまで。変更はちょっとややこしそうなので、また後日。



まず、クラスのインスタンス化はこんな感じです。

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では実際にフォルダの参照権限を変更してみます。