2017-05-26 4 views
1

Tout d'abord, je ne suis en aucun cas un expert PS, newbie totale - admission faite. J'ai cherché sur Internet ce dont j'avais besoin pour que le script fasse ce que je veux, mais j'ai atteint un point où j'ai du mal et j'ai besoin d'aide. Fondamentalement, j'ai créé un script en utilisant ISE qui saisit les utilisateurs dans une unité d'organisation, les traite en désactivant les comptes, en les renommant, en supprimant les groupes et en les déplaçant dans un autre dossier. Afin d'automatiser le processus de désactivation pour les utilisateurs. Mais j'ai maintenant besoin de créer un fichier journal chaque fois que cela fonctionne, pour montrer a) s'il a trouvé des utilisateurs dans l'OU d'origine (ToBeProcessed) et b) quels processus ont été exécutés et s'ils ont réussi. Voici le code.Connectez chaque processus Powershell au fichier texte à travers

$OUToBeProcessed = "OU=ToBeProcessed,OU=Users,OU=World,DC=local" 
$OURetired = "OU=RetiredUsers,OU=Users,OU=World,DC=local" 
$Users = Get-ADUser -SearchBase $OUToBeProcessed -Filter 'name -Like "*"' -Properties MemberOf 

ForEach($User in $Users){ 
    $SAN = $User.SamAccountName 

    #Disable user account 
    Disable-ADAccount -Identity $SAN 

    #Remove membership from groups for user 
    $User.Memberof | Remove-ADGroupMember -Member $User -Confirm:$False 

    $NewDN = "zzz_" + $User.Name 

    #Change display name 
    set-aduser $User -Displayname $newDN -ErrorAction SilentlyContinue 

    #Change distinguished name 
    Get-ADUser $SAN | Rename-ADObject -Newname $NewDN 

    Write-Host "$SAN may already exist." 

    #Move account to RetiredUsers 
    Get-Aduser $SAN | Move-ADObject -TargetPath $OURetired 
} 

Je suppose que je vais devoir utiliser soit une écriture de sortie ou fichier journal cmdlet, si quelqu'un avait également suggéré la transcription, mais je ne pense pas que ce soit ce que je dois.

J'ai essayé un certain nombre de façons d'incorporer l'écriture-sortie dans le script, il fonctionne sans erreurs, mais aucun fichier texte n'est produit. Mais je le place dans la boucle qui peut être le problème. Je l'ai placé en dehors de la boucle mais je pense que parce qu'il n'est pas passé quelque chose il crée le fichier avec rien dedans. J'apprécierais vraiment une certaine aide pour savoir où l'écriture-sortie pourrait devoir aller si c'est la bonne applet de commande.

+0

pipe vos chaînes de sortie souhaitées 'Out-File -Path path \ to \ log.file -Append' –

+0

@ MathiasR.Jessen - que » ll fonctionne, mais utiliser 'Out-File' dans une boucle n'est pas une bonne idée si la performance est un problème; il y a beaucoup de frais généraux dû à l'ouverture et à la fermeture du fichier à chaque fois dans la boucle. Moins sécurisé, mais plus efficace, pourrait consister à accumuler un tableau d'entrées dans la boucle et à écrire le tableau entier en une seule opération lorsque la boucle se termine. –

+0

@JeffZeitlin Que se passe-t-il si le script échoue? vous perdrez tous les événements de journalisation que vous avez eu – 4c74356b41

Répondre

0

Personnellement, j'ai tendance à ajouter une fonction Log à mes scripts. Quelque chose comme ça (où je sortie à l'hôte et le fichier):

Function Log { 
    Param (
     [Parameter(Mandatory=$true)] [string] $String, 
     [Parameter(Mandatory=$true)] [string] $LogFilePath, 
     [Parameter(Mandatory=$false)][ValidateSet("ERROR","WARN","INFO","DEBUG")] [string] $Level = "INFO" 
    ) 
    $LogString = ((Get-Date -Format "s") +" $Level $env:USERNAME $String") 
    Write-Host $LogString 
    Out-File -Append -FilePath $LogFilePath -InputObject $LogString 
} 

Ensuite, vous pouvez faire l'enregistrement:

Log "Something wrong!" "c:\mylog.log" "WARN" 
Log "Updated stuff" "c:\mylog.log" 

Ou chercher le http://www.powershellgallery.com/ pour les modules d'exploitation forestière.

Exemple (n'a pas essayé moi-même): https://www.powershellgallery.com/packages/PSLogging/2.5.2