Option Explicit Dim instance Dim strMoniker Dim objDescriptor 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 i Dim strACL Dim objArgs Dim FilePath Dim Objectpath Dim UserName Dim Permission Dim Message '' アクセス権のマスク Const FULLACCESS = 2032127 '' フルアクセス(All) Const READ = 1179817 '' 読み取り(RX) Const UPDATE = 1245631 '' 変更(RWXD) Const R = 1179785 '' 特殊なアクセス権(R) Const W = 1179926 '' 特殊なアクセス権(W) Const X = 1179808 '' 特殊なアクセス権(X) Const D = 65536 '' 特殊なアクセス権(D) Const P = 262144 '' 特殊なアクセス権(P) Const O = 524288 '' 特殊なアクセス権(O) ''変更するユーザ名を入力する Message = "ユーザ名を入力してください。" UserName = InputBox(Message, "") ''追加するユーザ名を入力してもらい、そのユーザが存在するのか確認する必要がある。 ''存在しないなら、再度ユーザ名を入力してもらう。 ''もしくはユーザデータベースからユーザ情報を引き出して、リストボックスに格納し、選択してもらう。 ''アクセス権の変更(現在:入力値で対応) → チェックボックスに変更した方が良い Message = "次の項目からアクセス権を選択してください。" & vbCrlf & _ "1) フルコントロール" & vbCrlf & _ "2) 読み取り" & vbCrlf & _ "3) 変更" & vbCrlf & _ "4) 特殊なアクセス権(R)" & vbCrlf & _ "5) 特殊なアクセス権(W)" & vbCrlf & _ "6) 特殊なアクセス権(X)" & vbCrlf & _ "7) 特殊なアクセス権(D)" & vbCrlf & _ "8) 特殊なアクセス権(P)" & vbCrlf & _ "9) 特殊なアクセス権(O)" & vbCrlf & _ "数値で入力をお願いします。" Permission = InputBox(Message, "") if Permission > 0 then if Permission < 10 then msgbox Permission else msgbox "不正な値です" WSCript.Quit end if else msgbox "不正な値です" WSCript.Quit end if select case Permission case 1 Permission = FULLACCESS case 2 Permission = READ case 3 Permission = UPDATE case 4 Permission = R case 5 Permission = W case 6 Permission = X case 7 Permission = D case 8 Permission = P case 9 Permission = O End Select '' ドラッグアンドドロップをサポート Set objArgs = WScript.Arguments For I = 0 to objArgs.Count - 1 FilePath = objArgs(I) Next ''ファイルパスの\マークを\\に置換する(この処理がないと、インスタンスを生成できない) FilePath = Replace(FilePath, "\", "\\") Const ImpLevel = "{impersonationLevel=impersonate}" Const namespace = "!root\cimv2:" ''ここにファイルパスを追加 Objectpath = "Win32_LogicalFileSecuritySetting=""" + FilePath + """" strMoniker = "winmgmts:" & ImpLevel & namespace & Objectpath Set instance = GetObject(strMoniker) If instance Is Nothing Then MsgBox ("インスタンスを取得出来ません。") WSCript.Quit End If retval = instance.getsecuritydescriptor(objDescriptor) Set DACL = objDescriptor.Properties_.Item("dacl") ' get dacl controlFlags = objDescriptor.Properties_.Item("controlflags") Set Group = objDescriptor.Properties_.Item("Group") Set Owner = objDescriptor.Properties_.Item("Owner") Set SACL = objDescriptor.Properties_.Item("Sacl") number_of_trustees = UBound(DACL.Value) msgbox number_of_trustees For i = 0 To number_of_trustees Set trustee_Domain = DACL.Value(i).Properties_.Item ("trustee").Value.Properties_.Item("Domain") Set trustee_Name = DACL.Value(i).Properties_.Item ("trustee").Value.Properties_.Item("Name") Set trustee_Sidstring = DACL.Value(i).Properties_.Item ("trustee").Value.Properties_.Item("Sidstring") accessmask = DACL.Value(i).Properties_.Item ("AccessMask").Value ' Save the accessmask Select Case accessmask Case FULLACCESS strACL = "フルコントロール(All)" Case READ strACL = "読み取り(RX)" Case UPDATE strACL = "変更(RWXD)" Case Else strACL = accessmask End Select If trustee_name = UserName Then 'アクセス許可の設定 'UserNameを「読み取り」にする objDescriptor.Properties_.Item("dacl").Value(i).Properties_.Item("AccessMask").Value = Permission End If Next retval = instance.setsecuritydescriptor(objDescriptor) If retval = 0 Then MsgBox "成功しました。" Else MsgBox "セキュリティ設定を変更できませんでした。" End If Set instance = Nothing WSCript.Quit