別に中身は見なくてもいいです。
VBS+WMI
Function SetSecurityHomeDirectory(strComputer, strUser, HomePath)
SetSecurityHomeDirectory = False
Set objWMIService = GetObject( "winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
'アカウント取得
Set wmiAccounts = objWMIService.ExecQuery ( "select * from Win32_Account where Name='" & strUser & "'")
For Each obj in wmiAccounts
Set wmiAccount = obj
Exit For
Next
'Trusteeに変換する
Set wmiTrusteeClass = objWMIService.Get("Win32_Trustee")
Set wmiTrustee = wmiTrusteeClass.spawnInstance_()
Set wmiSID = objWMIService.Get("Win32_SID.SID='" & wmiAccount.sid & "'")
wmiTrustee.domain = wmiSID.ReferencedDomainName
wmiTrustee.name = wmiSID.AccountName
wmiTrustee.sid = wmiSID.BinaryRepresentation
wmiTrustee.sidLength = wmiSID.sidLength
wmiTrustee.sidString = wmiSID.sid
'ACEオブジェクトを作成する
Set wmiACEClass = objWMIService.get("Win32_ACE")
Set wmiACE = wmiACEClass.spawnInstance_()
wmiACE.AccessMask = 1+2+4+8+16+32+64+128+256+65536+131072+262144+524288+1048576 ' 2032127
wmiACE.trustee = wmiTrustee
wmiACE.AceType = 0
wmiACE.AceFlags = 3
'対象フォルダのセキュリティデスクリプタを取得する
Set wmiFileSecSetting = GetObject( "winmgmts:Win32_LogicalFileSecuritySetting.path='" & HomePath & "'")
RetVal = wmiFileSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)
If ( RetVal <> 0 ) Then
WScript.Echo "GetSecurityDescriptorに失敗しました:" & RetVal
Exit Function
End If
'ディクショナリにDACLを転記する
Set DictACE = CreateObject("Scripting.Dictionary")
For i = LBound(wmiSecurityDescriptor.DACL) to UBound(wmiSecurityDescriptor.DACL)
If ( not wmiSecurityDescriptor.DACL(i).AceFlags and 16 ) Then
Call DictACE.Add( i, wmiSecurityDescriptor.DACL(i) )
End if
Next
'設定する新しいACEオブジェクトを最後に足す
Call DictACE.add( "NewUser", wmiACE )
'DACLに書き戻す
wmiSecurityDescriptor.DACL = DictACE.Items
'対象フォルダのセキュリティデスクリプタを設定する
RetVal = wmiFileSecSetting.SetSecurityDescriptor(wmiSecurityDescriptor)
If ( RetVal <> 0 ) Then
WScript.Echo "SetSecurityDescriptorに失敗しました:" & RetVal
Exit Function
End If
SetSecurityHomeDirectory = True
End Function
C#+.NET2,0
public void SetFullAccess(string Path, string UserName)
{
DirectorySecurity ds = System.IO.Directory.GetAccessControl(Path);
bool modified;
bool ReturnValue = ds.ModifyAccessRule(AccessControlModification.Set, new FileSystemAccessRule(UserName, FileSystemRights.FullControl, AccessControlType.Allow), out modified);
if (modified == false || ReturnValue == false)
{
throw new Exception("アクセス権限を変更するのに失敗しました。");
}
ReturnValue = ds.ModifyAccessRule(AccessControlModification.Add, new FileSystemAccessRule(UserName, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow), out modified);
if (modified == false || ReturnValue == false)
{
throw new Exception("アクセス権限を変更するのに失敗しました。");
}
System.IO.Directory.SetAccessControl(Path, ds);
//FileSystemAccessRule fsar = new FileSystemAccessRule(UserName, FileSystemRights.
}