2017-05-28 1 views
0

J'ai élaboré toutes les parties de mon script qui créent des noms de répertoires, crée les répertoires en fonction d'un répertoire prédéfini structure, crée un groupe AD basé sur un numéro de projet ajouté à un nom codé en dur, puis ajoute le groupe à un répertoire particulier et définit la liste de contrôle d'accès pour ce groupe.PowerShell Set-Acl Nouvel objet: Impossible de trouver une surcharge pour "FileSystemAccessRule" et le nombre d'arguments: "4"

Je ne peux pas sembler contourner l'erreur:

New-Object : Cannot find an overload for "FileSystemAccessRule" and the argument count: "4".

Voici le script:

$domain="DOMAIN" 
    $tldn="net" 

    [email protected]() 
    $pathArr+=$path1=Read-Host -Prompt "Enter first path" 
    $pathArr+=$path2=Read-Host -Prompt "Enter second path" 
    [int]$projectNumber=try { Read-Host -Prompt "Enter project number" } catch { Write-Host "Not a numeric value. Please try again."; exit } 
    [string]$mainFolder=[string]${projectNumber}+"_"+(Read-Host -Prompt "Please give the main folder name") 
    $projectNumberString=[string]$projectNumber 
    $projectName=Read-Host -Prompt "Please give the project name" 
    $fullProjectName="${projectNumberString}_${projectName}" 
    $pathArr+=$path3="$path1\$mainFolder" 
    $pathArr+=$path4="$path2\$mainFolder" 
    $pathArr+=$path5="$path3\$fullProjectName" 
    $pathArr+=$path6="$path4\$fullProjectName" 

    # Region: Create organizational units in Active Directory 
    # Names 
    $ouN1="XYZOU" 
    $ouN2="ABCOU" 

    # Paths 
    $ouP0="DC=$domain,DC=$tldn" 
    $ouP1="OU=$ouN1,$ouP0" 
    $ouP2="OU=$ouN2,$ouP1" 

    Write-Host "Checking for required origanization units..." 
    try 
    { 
     New-ADOrganizationalUnit -Name $ouN1 -Path $ouP1 
     New-ADOrganizationalUnit -Name $ouN2 -Path $ouP2 

    } 
    catch 
    { 
     Out-Null 
    } 

    Write-Host "Creating AD Group..." 
    [string]$group="BEST_${projectNumberString}" 
    $groupdomain="$domain\$group" 

    $ADGroupParams= @{ 
     'Name' = "$group" 
     'SamAccountName' = "$group" 
     'GroupCategory' = "Security" 
     'GroupScope' = "Global" 
     'DisplayName' = "$group" 
     'Path' = "OU=MyBusinessOU,DC=$domain,DC=$tldn" 
     'Description' = "Test share" 
    } 
    $secgroup=New-ADGroup @ADGroupParams 

    # Region: Set permissions 
    Write-Host "Setting permissions..." 

    # get permissions 
    $acl = Get-Acl -Path $path6 

    # add a new permission 
    $InheritanceFlags=[System.Security.AccessControl.InheritanceFlags]”ContainerInherit, ObjectInherit” 
    $FileSystemAccessRights=[System.Security.AccessControl.FileSystemRights]"Traverse","Executefile","ListDirectory","ReadData", "ReadAttributes", "ReadExtendedAttributes","CreateFiles","WriteData", 'ContainerInherit, ObjectInherit', "CreateDirectories","AppendData", "WriteAttributes", "WriteExtendedAttributes", "DeleteSubdirectoriesAndFiles", "ReadPermissions" 
    $InheritanceFlags=[System.Security.AccessControl.InheritanceFlags]”ContainerInherit, ObjectInherit” 
    $PropagationFlags=[System.Security.AccessControl.PropagationFlags]”None” 
    $AccessControl=[System.Security.AccessControl.AccessControlType]”Allow” 
    $permission = "$groupdomain", "$InheritanceFlags", "$PropagationFlags", "$AccessControl" 
    $rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission 
    $acl.SetAccessRule($rule) 

    # set new permissions 
    $acl | Set-Acl -Path $path6 

Encore une fois, je suis en train de faire ce que je normalement faire manuellement dans Active Directory un environnement Windows

  1. Créer un groupe AD
  2. Ajouter le groupe à une action
  3. Définir les autorisations au groupe
  4. Ce script ne pas ajouter les utilisateurs au groupe

La dernière étape et finale définissant l'autorisation; malheureusement, quand je lance le script, change la syntaxe ou la méthode (en suivant des exemples tirés de plusieurs articles en ligne) et passe des heures là-dessus maintenant, je ne fais aucun progrès. Le seul progrès a été que le nombre qu'il ne pouvait pas surcharger est passé de 18 à 4.

Nous vous remercions de votre aide à l'avance!

EDIT

I modifié le script par un commentaire indiquant que je manqué l'argument $FileSystemAccessRights.

La variable $permission a été changé pour:

$permission = "$groupdomain", "$FileSystemAccessRights", "$InheritanceFlags", "$PropagationFlags", "$AccessControl"

Je reçois encore cette sortie:

New-Object : Cannot convert argument "1", with value: "ExecuteFile Executefile ListDirectory ReadData ReadAttributes 
ReadExtendedAttributes CreateFiles WriteData ContainerInherit, ObjectInherit CreateDirectories AppendData WriteAttributes 
WriteExtendedAttributes DeleteSubdirectoriesAndFiles ReadPermissions", for "FileSystemAccessRule" to type 
"System.Security.AccessControl.FileSystemRights": "Cannot convert value "ExecuteFile Executefile ListDirectory ReadData 
ReadAttributes ReadExtendedAttributes CreateFiles WriteData ContainerInherit, ObjectInherit CreateDirectories AppendData 
WriteAttributes WriteExtendedAttributes DeleteSubdirectoriesAndFiles ReadPermissions" to type 
"System.Security.AccessControl.FileSystemRights". Error: "Unable to match the identifier name ExecuteFile Executefile ListDirectory 
ReadData ReadAttributes ReadExtendedAttributes CreateFiles WriteData ContainerInherit, ObjectInherit CreateDirectories AppendData 
WriteAttributes WriteExtendedAttributes DeleteSubdirectoriesAndFiles ReadPermissions to a valid enumerator name. Specify one of the 
following enumerator names and try again: ListDirectory, ReadData, WriteData, CreateFiles, CreateDirectories, AppendData, 
ReadExtendedAttributes, WriteExtendedAttributes, Traverse, ExecuteFile, DeleteSubdirectoriesAndFiles, ReadAttributes, 
WriteAttributes, Write, Delete, ReadPermissions, Read, ReadAndExecute, Modify, ChangePermissions, TakeOwnership, Synchronize, 
FullControl"" 

EDIT

J'ai essayé de supprimer les citations des variables parce qu'il semble que chaque variable avait déjà des citations à l'exception de $groupdomain, puis a obtenu cette erreur:

New-Object : Cannot convert argument "1", with value: "System.Object[]", for "FileSystemAccessRule" to type 
"System.Security.AccessControl.FileSystemRights": "Cannot convert value 
"ExecuteFile,Executefile,ListDirectory,ReadData,ReadAttributes,ReadExtendedAttributes,CreateFiles,WriteData,ContainerInherit, 
ObjectInherit,CreateDirectories,AppendData,WriteAttributes,WriteExtendedAttributes,DeleteSubdirectoriesAndFiles,ReadPermissions" to 
type "System.Security.AccessControl.FileSystemRights". Error: "Unable to match the identifier name 
ExecuteFile,Executefile,ListDirectory,ReadData,ReadAttributes,ReadExtendedAttributes,CreateFiles,WriteData,ContainerInherit, 
ObjectInherit,CreateDirectories,AppendData,WriteAttributes,WriteExtendedAttributes,DeleteSubdirectoriesAndFiles,ReadPermissions to a 
valid enumerator name. Specify one of the following enumerator names and try again: ListDirectory, ReadData, WriteData, 
CreateFiles, CreateDirectories, AppendData, ReadExtendedAttributes, WriteExtendedAttributes, Traverse, ExecuteFile, 
DeleteSubdirectoriesAndFiles, ReadAttributes, WriteAttributes, Write, Delete, ReadPermissions, Read, ReadAndExecute, Modify, 
ChangePermissions, TakeOwnership, Synchronize, FullControl"" 

EDIT

Essayé ce que Stephen suggère entourant oute la New-Object avec des guillemets, puis a obtenu cette erreur:

Cannot convert argument "rule", with value: "New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList 
WOLF\Elite_1035 Write, Read ContainerInherit, ObjectInherit None Allow", for "SetAccessRule" to type 
"System.Security.AccessControl.FileSystemAccessRule": "Cannot convert the "New-Object -TypeName 
System.Security.AccessControl.FileSystemAccessRule -ArgumentList WOLF\Elite_1035 Write, Read ContainerInherit, ObjectInherit None 
Allow" value of type "System.String" to type "System.Security.AccessControl.FileSystemAccessRule"." 

EDIT L'erreur est partie, mais je ne sais toujours pas '

t voir tout groupe ajouté aux propriétés de sécurité de $path6.

j'ai pu ajouter aussi toutes les autorisations, théoriquement, en faisant ceci:

$FileSystemAccessRights=[System.Security.AccessControl.FileSystemRights]"Traverse,Executefile,ListDirectory,ReadData, ReadAttributes, ReadExtendedAttributes,CreateFiles,WriteData,CreateDirectories,AppendData,WriteAttributes,WriteExtendedAttributes,DeleteSubdirectoriesAndFiles, ReadPermissions"

+0

Avez-vous essayé enfermer la permission de $ entre parenthèses, sur la ligne New-Object? Vous pouvez également mettre des parenthèses autour de la clause New-Object entière. –

+0

@StephenGTuggy J'ai essayé cela puis mis à jour ma question. – scriptkiddie

Répondre

0

Vous avez oublié $FileSystemAccessRights dans les arguments

$permission = $groupdomain, $FileSystemAccessRights, $InheritanceFlags, $PropagationFlags, $AccessControl 

Modifier, supprimer les guillemets doubles.

Vous avez encore deux questions:

d'abord créer un principal objet $

$principal = New-Object System.Security.Principal.NTAccount($groupdomain) 

Ensuite, essayez réduire que $ FileSystemAccessRights parce qu'il a des problèmes, essayez quelque chose de simple pour commencer comme l'accès en lecture/écriture.

$FileSystemAccessRights=[System.Security.AccessControl.FileSystemRights]"Read, Write" 

Mise à jour de la création de la variable de l'autorisation d'inclure $ le principal:

$permission = $principal, $FileSystemAccessRights, $InheritanceFlags, $PropagationFlags, $AccessControl 
+0

Merci de l'avoir signalé. J'ai modifié mon script, et je reçois encore un message d'erreur similaire. Des idées? – scriptkiddie

+0

Oui, essayez de supprimer les guillemets, j'ai mis à jour la réponse. –

+0

Apparaît également que le premier argument est le $ FileSystemAccessRights, devrait être $ groupdomain comme dans la réponse. –