[Scripting] Powershell

Powershell [Scripting] - Management du SI - Systèmes & Réseaux Pro

Marsh Posté le 25-11-2011 à 09:02:19    

Powershell, enfin un shell pour Windows.
 
Il n'y a pas encore de topic de référence sur ce produit, il faut corriger ce manque.
 
Je débute avec cet outil et je trouve que l'on apprends très vite, sur la base de cas pratiques et de recherches Google. L'idée de ce topic serait donc de partager notre expérience, nos recherches et nos trouvailles concernant Powershell (aka PoSh).
 
N'hésitez pas, participez !
Je pense que ce script à plus sa place ici que dans la cat Prog, mais je ne trouve pas de sous-cat appropriée. Modo, éclairez-moi :o
 
Quelques idées de sujets à aborder :

  • Quel éditeur utilisez-vous ?
  • Quelles sont les bonnes pratiques à appliquer ?
  • Comment gérer les erreurs ? try/catch/finally vs. throw/trap vs. ErrorAction/$? vs. $Error vs. ...
  • set-strictmode or Not ?
  • et VBS, il est mort ?
  • Faut-il signer les scripts ?

Reply

Marsh Posté le 25-11-2011 à 09:02:19   

Reply

Marsh Posté le 25-11-2011 à 09:02:51    

Je commence par mon petit cas perso :
Mon environnement : Win 7 + module AD + PowerShell ISE sur mon poste et ADMGS sur certains DC.
Mes principaux besoins : intercation avec un domaine Active Directory plutôt vaste (bcp d'utilisateurs, de serveur, de sites, ...).
Ma pratique du scripting Posh : Quick & Dirty assez souvent, basique et sans IHM à chaque fois, sans composants tiers.
 
Script à partager/critiquer :
 
Contexte : Lire les dernières lignes des fichiers de logs, même volumineux. A la manière de tail sous Unix. Le script a été élboré sur la base de scripts trouvés sur le net avec quelques adaptations. Je souhaitais pouvoir utiliser le pipe et plusieurs fichiers. La dernière modification apportée concernant l'accès au fichier : je devais pouvoir lire des fichiers lockés.
 

Code :
  1. function Get-tail {
  2. param(
  3.    [Parameter(Mandatory=$true,
  4.               Position=0,
  5.               ParameterSetName="Path",
  6.               ValueFromPipeline=$true,
  7.               ValueFromPipelineByPropertyName=$true)]
  8.    [ValidateNotNullOrEmpty()]
  9.    [string[]]
  10.    $Path,
  11.   
  12.    [Parameter()]
  13.    [ValidateRange(0, 2GB)]
  14.    [int]
  15.   $Last = 10,
  16.   
  17.    [Parameter()]
  18.    [int]$CharsPerLine = 500
  19. )
  20. $files = @(Get-ChildItem $path);
  21.    foreach ($file in $files)
  22.    {
  23.        if (-not $file) {return}
  24.        $fs = [System.IO.File]::Open($file,[System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
  25.        $BytesToRead = $charsPerLine * $last
  26.       
  27.        if ($BytesToRead -ge $fs.length) {$BytesToRead = $fs.length}
  28.        $fs.Position = $fs.Length - $BytesToRead
  29.        $Stream = New-Object System.IO.StreamReader($fs)
  30.        $Stream.readtoend() -split "`n" -replace "\s+$","" | Select-Object -last $Last
  31.       
  32.        $Stream.Close()
  33.        $fs.Close()
  34.       
  35.    }
  36. }

Reply

Marsh Posté le 25-11-2011 à 09:03:00    

résérvé

Reply

Marsh Posté le 25-11-2011 à 17:01:01    

S'il s'agit de récupérer les logs Windows on peut le faire très simplement avec Get-WinEvent.
 
Sinon je l'utilisa principalement avec Active Directory et Exchange et c'est un vrai plaisir d'avoir un CLI de ce niveau (bon dsquery reste très correct). Malheureusement pour l'AD la version actuelle est basique et pour des manips plus pointues (Délégation, PKI...) il faut passer par les cmdlets Quest (mais ils sont gratuits). La version 3 devrait compenser ce manque.
 
ET pour le VBS, il n'est plus supporté par MS, comme les autres outils de scripting d'ailleurs. MS est en train de centraliser les utilitaires d'administration et de scripting en un seul.
 

Reply

Marsh Posté le 25-11-2011 à 17:04:07    

Mon besoin était sur des fichiers de log tiers ou des fichiers text comme le netlogon.log. Vu les volumes, un simple get-content est trop gourmand.
 
Pour les délégations, à quoi penses-tu ? Les manips d'ACL sont déjà possible, peu importe l'objet.

Reply

Marsh Posté le 25-11-2011 à 17:33:26    

Oui les manip d'ACL sur des objets AD, par exemple spécifier que le groupe helpdesk à le droit de reseter les mots de passe sur l'OU utilisateurs.
J'avais regardé du côté de Get/Set-ACL mais il me semblait plus adapté au ACL de fichiers/répertoires.

Reply

Marsh Posté le 25-11-2011 à 19:26:34    

je m'en suis servi pour manipuler les droits sur les GPOs récemment. C'est super puissant :D

Reply

Marsh Posté le 25-11-2011 à 19:43:45    

Effectivement, j'aurai jamais cru pouvoir réaliser une délégation complète en quelques lignes.
 
Les précédentes avaient été réalisées en VBS...je crois que je me serai mis une balle si j'aurai du scripter çà.
 
Le gros problème étant que la CLI continue de faire peur à beaucoup de gens...

Reply

Marsh Posté le 25-11-2011 à 19:49:37    

Plus généralement, dans l'univers du système, j'ai l'impression que le scripting est peu présent. C'est pourtant un outil précieux.

Reply

Marsh Posté le 25-11-2011 à 20:52:37    

Chez nous la plupart des projets qu'on délivre c'est script only.
 
Ca permet de passer de docs d'install/config de 300 pages à une trentaine/quarantaine en évitant les mauvaises manips. En plus c'est répétable facilement (juste des fichiers xml la plupart du temps pour entrer les paramètres du script).
 
Déploiement d'exchange, lync, hyper-v, scvmm, sccm, mdt, ad and co.

Reply

Marsh Posté le 25-11-2011 à 20:52:37   

Reply

Marsh Posté le 26-11-2011 à 17:42:51    

Pour nous ce sont les clients qui nous imposent ceci, plus facile à recetter notamment.

Reply

Marsh Posté le 28-11-2011 à 17:21:38    

Je pose mon drapeau .. Je ne vais pas tarder à mettre les mains dans le cambouis .
 


---------------
www.google.fr  
Reply

Marsh Posté le 02-12-2011 à 17:24:14    

Moi je vous propose de lancer ça avec Powershell :

Code :
  1. iex (New-Object Net.WebClient).DownloadString("http://bit.ly/e0Mw9w" )

Reply

Marsh Posté le 02-12-2011 à 17:37:40    

je me méfie :o Le script que ça lance à un joli truc planqué :o
..
Plus de la musique ...


Message édité par Je@nb le 02-12-2011 à 17:45:18
Reply

Marsh Posté le 02-12-2011 à 17:39:35    

C'est con ! :D

 

et faut être connaisseur, sinon c'est pas drôle.


Message édité par Zaib3k le 02-12-2011 à 17:44:26
Reply

Marsh Posté le 02-12-2011 à 17:45:49    

C'est du base64 hein, tu le décodes avec les 3 premières lignes.
 
Mais ouais c'est drôle :p

Reply

Marsh Posté le 02-12-2011 à 20:21:44    

Enorme !
 
Merci  :lol:

Reply

Marsh Posté le 13-12-2011 à 14:11:25    

Avez-vous des idées pour manipuler DFSN ? dfsutil.exe :/ ?

Reply

Marsh Posté le 05-01-2012 à 07:40:32    

Pour DFSN, je n'ai rien troué d'autre que dfsutil.
 
Je cherche désormais un exemple de script powershell pour parcourir une boite Lotus Notes. J'ai déjà des éléments mais j'ai du mal à manipuler les documents pour récupérer les champs.
 
Des pistes ?

Reply

Marsh Posté le 09-01-2012 à 11:45:12    

J'ai utilisé ça :o
 

Code :
  1. # Create LN Object
  2. $DomSession = New-Object -ComObject Lotus.NotesSession
  3. # Initialize LN Object
  4. # You'll be asking for LN password to your id
  5. $DomSession.Initialize()
  6. # Connect to Server, select db and display the name
  7. $DomDatabase = $DomSession.GetDatabase("leserveur","labase.nsf" )
  8. Write-Host "Database open : " $DomDatabase.Title
  9. # Open specific View (Forum\Principale (forum))
  10. $DomView = $DomDatabase.GetView('($All)')
  11. Write-Host "View read : " $DomView.Name
  12. # Show number of documents
  13. $DomNumOfDocs = $DomView.AllEntries.Count
  14. Write-Host "Num of Docs : " $DomNumOfDocs
  15. # Get First Document in the View
  16. $DomDoc = $DomView.GetFirstDocument()
  17. # parcours
  18. while ($DomDoc -ne $null) {
  19.     $from = $DomDoc.ColumnValues[4]
  20.     $date = $DomDoc.ColumnValues[8].toshortdatestring()
  21.     "$from,$date"  | out-file ".\export.csv" -Append
  22.     $DomDoc = $DomView.GetNextDocument($DomDoc)
  23. }


 
Sinon, je cherche une info : Quelle est la position officielle de MS sur VBScript ? Je croyais qu'il était abandonné mais je n’arrive pas à trouver de communication "officielle".

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed