2013-02-15 11 views
5

私はADで新しいドメインユーザーアカウントを作成し、関連するアクセス許可を持つファイルサーバーにホームディレクトリを作成するpowershellスクリプトを実行しています。Powershellスクリプトでユーザーのホームフォルダを作成し、アクセス許可を設定する

私の問題は、私はアクセス許可セットを取得できないということです。

以下のコードでは、my_fileServerはファイルサーバー名です。 ssoは、以下のテストコードで "user9999"に設定されているシングルサインオンIDを意味します。

ご協力いただきありがとうございます。

Set-Variable homeDir -option Constant -value "\\my_fileServer\Users" 
Set-Variable sso -option Constant -value "user9999" 

# If the folder for the user does not exist, make a new one and set the correct permissions. 
if ((Test-Path "$homeDir\$sso") -eq $false) 
{ 
    try 
    { 
     $NewFolder = New-Item -Path $homeDir -Name $sso -ItemType "Directory" 
     $Rights = [System.Security.AccessControl.FileSystemRights]"FullControl,Modify,ReadAndExecute,ListDirectory,Read,Write" 
     $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None 
     $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
     $objType =[System.Security.AccessControl.AccessControlType]::Allow 
     $objUser = New-Object System.Security.Principal.NTAccount "my_full_domain_name\$sso" 
     $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ` 
       ($objUser, $Rights, $InheritanceFlag, $PropagationFlag, $objType) 
     $ACL = get-acl -Path $NewFolder 
     $ACL.AddAccessRule($objACE) 
     $objReturn = Set-ACL -Path "$homeDir\$sso" -AclObject $ACL 
    $objReturn 
    } 
    catch 
    { 
     $msg = $_ 
     $msg 
    } 
} 

ホームフォルダは作成されてもOKですが、ユーザーのアクセス許可を確認するとボックスには何も表示されません。 enter image description here

+0

Set-Aclは値を返しません。 –

答えて

6

問題はあなたの恩人です。サブフォルダとファイル(彼が自分のフォルダに所有しているアイテム)に継承される権限を許可していません。そのため、基本セキュリティウィンドウにはアクセス許可(「特別なアクセス許可」のみ)が表示されません。 「高度なセキュリティ設定」を開くと、ユーザーはコンテンツ以外のフルコントロールを持っていることがわかります。 CREATOR OWNERの権限(継承付き)を追加してオーナーがアイテムにアクセスできるようにする限り、あなたは大丈夫だと思います。しかし、あなたはこのように今既にそれを修正できます。特別な要件がある場合を除き

$InheritanceFlag = @([System.Security.AccessControl.InheritanceFlags]::ContainerInherit,[System.Security.AccessControl.InheritanceFlags]::ObjectInherit) 

、あなたは、ユーザーが自分のフォルダ(フル継承)を完全にアクセス権を与える必要があります。私は悲しいことまで投票することはできませんが、私は(GraimerとCB)上記の両方の答えに同意

try 
{ 
    $NewFolder = New-Item -Path $homeDir -Name $sso -ItemType "Directory" 
    $Rights = [System.Security.AccessControl.FileSystemRights]"FullControl,Modify,ReadAndExecute,ListDirectory,Read,Write" 
    $InheritanceFlag = @([System.Security.AccessControl.InheritanceFlags]::ContainerInherit,[System.Security.AccessControl.InheritanceFlags]::ObjectInherit) 
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
    $objType =[System.Security.AccessControl.AccessControlType]::Allow 
    $objUser = New-Object System.Security.Principal.NTAccount "my_full_domain_name\$sso" 
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ` 
      ($objUser, $Rights, $InheritanceFlag, $PropagationFlag, $objType) 
    $ACL = Get-Acl -Path $NewFolder 
    $ACL.AddAccessRule($objACE) 
    Set-ACL -Path $NewFolder.FullName -AclObject $ACL 
} 
+0

ありがとうございます!今私は理由を理解する.. – user1866880

0

すべてのアクセス許可が正しく'Special Permmissions'に設定されている場合は、Advancedをクリックして[承認]タブをクリックします。

2

、実際の答え:一定の継承(私もあなたのSet-ACLパスをクリーンアップし、不要なreturnobjectを削除)との完全なソリューション両方の組み合わせです。
- 「アドバンスド」ウィンドウでアクセス許可をチェックする必要があります
- コードが継承されずに「動作する」場合でも、ユーザーは割り当てられたフォルダで多くのことを行うことができません。

0

簡潔にしておきましょう。欠けていたのはSetAccessRuleProtectionの機能です。

ここでは、必要なティックを与えるコードを示します。

if (-not (Test-Path "$homeDir\$sso")) 
{ 
    $acl = Get-Acl (New-Item -Path $homedir -Name $sso -ItemType Directory) 

    # Make sure access rules inherited from parent folders. 
    $acl.SetAccessRuleProtection($false, $true) 

    $ace = "$domain\$sso","FullControl", "ContainerInherit,ObjectInherit","None","Allow" 
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($ace) 
    $acl.AddAccessRule($objACE) 
    Set-ACL -Path "$homeDir\$sso" -AclObject $acl 

} 
関連する問題