9
votes

PowerShell: où {_.name pas en $ objet}

Je construis un script qui répertorie tous les comptes informatiques inactifs. J'aimerais exclure quelques systèmes des résultats.

J'ai un fichier texte contenant tous les systèmes à exclure (un nom système par ligne). Tous les articles sont stockés dans un objet avec nom de propriété "Nom". Donc, $ exclu contiendra: xxx

pour répertorier tous les systèmes inactifs que j'utilise la cmdlet de recherche-adaccount: xxx

de Bien sûr, je peux faire boucler tous les résultats 1 de 1, mais y a-t-il un moyen simple d'exclure les systèmes directement des résultats? J'ai un sentiment qu'il est possible avec Select-Object ou où-objet, mais je ne peux pas comprendre comment comparer les résultats dans un objet.


0 commentaires

3 Réponses :


4
votes

Importer le fichier d'exclusion (en tant que CSV) et utiliser l'opérateur -NotContains:

$names = Import-csv exclude.txt | Foreach-Object {$_.Name} 

$InactiveComputers = Search-ADAccount -AccountInactive -TimeSpan 90 -ComputersOnly | Where {$_.Enabled -eq $true -and $names -notcontains $_.Name}


6 commentaires

Ce n'est pas possible: le fichier d'exclusion contient également des commentaires (= une ligne commençant par A;) et des lignes Blanc. Je ne veux pas qu'ils incluent dans mon objet $ exclus.


Vous n'avez pas mentionné cela dans votre question. Vous pouvez travailler avec: importer-csv exclude.txt | où {$ _. Nom -Match '\ s' -At $ _. Nom -notlike "; *"}


Merci pour les conseils. Malheureusement, cette commande renvoie un objet vide. import-csv excluded.txt fonctionne. Mais quand j'ajoute le forach ou où l'instruction, il renvoie un ensemble vide


ignorer ce dernier commentaire. Mon mauvais.import-csv combiné avec les travaux.


Mais Infortement, cela n'a pas fonctionné. Recherche-Adaccounts Stil inclut aussi les articles exclus :(


Faisons un test, $ NAMES = 'SYS1', 'SYS2', 'SYS3', avez-vous toujours ces ordinateurs lorsque vous exécutez la commande de recherche-adaccount?



1
votes

Je pense que vous pouvez utiliser -NotContains code> ( TechNet Article ) Opérateur:

$InactiveComputers = Search-ADAccount -AccountInactive -TimeSpan 90 -ComputersOnly | Where {$_.Enabled -eq $true -and $excluded -notcontains $_.name }


1 commentaires

Désolé, j'ai essayé cela auparavant, mais ça ne marche pas. Je pense que c'est parce que $ inactivecomputers contient plus d'articles (SamaccountName, nom, activé, SID, ...) Bien que $ exclu ne contient que "nom". Comment fonctionne-t-il comment les faire correspondre?



22
votes

Vous étiez essentiellement correct à l'aide de cela dans votre titre: "Où {_.name pas en $ objet}"

Syntaxe est un peu différent. Tuyez-le sur le suivant P>

Where { $_.Name -notin $excluded }


2 commentaires

Quelle était la valeur $ psversiontable.psversion du PSV2 que vous avez testé?


@Matthew Désolé, je l'exécutais sur un ordinateur portable de travail que je n'en ai plus, je ne peux donc pas dire avec certitude. Je ne me souviens pas de la version mineure exact PowerShell. Seulement rappeler les principales versions. J'ai fait des creuser et j'ai trouvé ceci: TechEt.microsoft.com/en-us/ Bibliothèque / HH847759.aspx Il montre que PowerShell V3 introduit -NOTTINE, vous devez donc utiliser la première méthode pour que celui-ci fonctionne dans V2 (où {! ($ _. Nom -inin exclu)}) . J'espère que cela t'aides!