45 votes

PowerShell ? L'utilisez-vous ? Pouvez-vous me montrer des trucs sympas d'administration de système que je peux faire avec ?

Je lis partout que PowerShell est la voie de l'avenir. Lors de sa sortie, j'ai fait tout un tas de laboratoires virtuels, mais depuis, je ne l'ai toujours pas utilisé dans un environnement de production. Je sais que le jour viendra où j'aurai affaire à des systèmes d'exploitation où il sera déjà installé, alors je veux être prêt.

Je veux savoir :

  1. L'utilisez-vous ?
  2. Quel a été votre processus d'initiation à l'utilisation de PowerShell ?
  3. Quel type de tâches d'administration de système avez-vous réalisé à l'aide de ce logiciel ?
  4. Je suis administrateur de base de données SQL Server. Quelles sont les choses les plus intéressantes à faire avec ce serveur ?

Il semble que tout le monde soit d'accord pour dire que Microsoft insiste beaucoup sur ce point, mais personne ne l'utilise encore. J'aimerais connaître le point de vue des administrateurs système qui l'utilisent pour effectuer des tâches quotidiennes et partager des exemples de code.

7voto

user4623 Points 191

Ayant utilisé unix Shell Shell dans une carrière précédente, puis étant passé à l'administration de serveurs Windows, je peux dire que j'apprécie vraiment, vraiment powershell - je n'ai pas le temps ni la capacité d'apprendre trop de syntaxe obscure et j'ai été agréablement surpris que beaucoup de Shell powershell peuvent être écrits avec un langage très simple... prenez ce que cela vaut car j'étais habitué à ksh !!...

Je prédis qu'il existera encore longtemps.

7voto

Julio Points 11

J'ai trouvé cela génial : avec SQL Server 2008, vous disposez de nouvelles extensions PowerShell qui vous permettent de naviguer dans les bases de données SQL comme dans votre système de fichiers local ou votre registre.

Après avoir installé les outils SQL Server Client, vous pouvez ouvrir n'importe quelle base de données dans PowerShell (via le menu contextuel du clic droit) et jouer avec elle d'une manière orientée objet :

PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\ExampleDB\>function prompt {"PS >"}
PS >cd tables
PS >dir

SCHEMA          NAME         CREATED
------          ----         -------
dbo             MyTable      25/06/2009 17:02

PS > dir | format-table name, columns, rowcount, parent

NAME            COLUMNS      ROWCOUNT      PARENT
----            -------      --------      ------
MyTable         {Id, Name}   0             {ExampleDB}

PS >$myTable = dir | where {$_.Name -eq "MyTable"}
PS >$myTable.Script()

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[MyTable](
[Id] [int] IDENTITY(1,1) NOT NULL
[Name] [nText] NOT NULL
) ON [PRIMARY]

PS >set-location \SQL\AnotherServer\Default
PS >cd databases\Northwind\tables
PS >$myTables = dir | where {$_.Rowcount -gt 100 -and $_.HasIndex -eq 1}
PS >$myTables.Count

8

PS >foreach ($table in $tables) {$table.RebuildIndexes(90)}

Notez que la première ligne modifie simplement l'invite afin qu'elle ne soit pas trop longue.

J'espère qu'à part cela, ce qui se passe ici est évident :)

5voto

Chris Points 409

SQL Server 2008 dispose désormais d'options contextuelles PowerShell dans Management Studio, ce qui signifie qu'il n'y a pas qu'Exchange qui l'adopte. Pensez aussi que c'est le remplacement du DOS, car c'est à peu près ce que pensait MS, qui ne pouvait pas améliorer la sécurité du DOS pour des questions de rétrocompatibilité, alors ils ont créé quelque chose de nouveau et wammo, le problème est résolu !

4voto

theraccoonbear Points 2562

Je suis également DBA et scripteur de longue date, remontant aux fichiers batch DOS, V3.3 ! Je suis passé à VB script mais PS est très puissant. Jetez un coup d'œil à - Désolé, je ne peux pas poster le lien, car je suis un nouvel utilisateur. Je l'ai trouvé sur le blog d'Otto Helweg. Il s'agit d'un outil d'inventaire logiciel bon marché et agréable à utiliser.

  • 1- Extrait la liste des ordinateurs à interroger d'une table de base de données.
  • 2- Ajoute les données et l'heure actuelles au résultat
  • 3- Enregistre les résultats de l'audit dans une base de données

Exemple PowerShell script :

# Open the database connection
$dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi"
$dbConn.Open()
$sqlQuery = $dbConn.CreateCommand()

# Get all known computers
$sqlQuery.CommandText = "select * from Inventory..Computers"
$reader = $sqlQuery.ExecuteReader()
$computersToQuery = @()
while ($reader.Read()) {
   $computersToQuery += $reader["Computer"]
}

# Close the database connection
$dbConn.Close()

$softwareInventory = @{}
foreach ($computer in $computersToQuery) {
   $psinfoOutput = ./psinfo.exe -s Applications \\$computer

   $foundSoftwareInventory = 0
   $computerName = ""
   foreach ($item in $psinfoOutput) {
      if ($foundSoftwareInventory -eq 1) {
         # Force the results to a string
         # Remove any single quotes which interfere with T-SQL statements
         # Load the result into a hash whereby removing any duplicates
         [string]$softwareInventory[$computerName][$item.Replace("'","")] = ""
      }

      if ($item -like "System information for *") {
         $computerName = $item.Split("\")[2].TrimEnd(":")
      } elseif ($item -eq "Applications:") {
         $foundSoftwareInventory = 1
         $softwareInventory[$computerName] = @{}
      }
   }
}

$dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi"
$dbConn.Open()
$sqlQuery = $dbConn.CreateCommand()

foreach ($computer in $softwareInventory.Keys) {
   foreach ($softwareItem in $softwareInventory[$computer].Keys) {
      "Loading-" + $computer + ":" + $softwareItem

      # Try an Update then an Insert 
      trap {
         $sqlQuery.CommandText = "update Inventory..SoftwareInventory set AuditDate = getdate() where  Computer = '" + $computer + "' and Software = '" + $softwareItem + "'"
         $result = $sqlQuery.ExecuteNonQuery()
         continue
      }

      $sqlQuery.CommandText = "insert into Inventory..SoftwareInventory (Computer,Software,AuditDate) values ('" + $computer + "','" + $softwareItem + "',getdate())"
      $result = $sqlQuery.ExecuteNonQuery()
   }
}

$dbConn.Close()

Dave J

3voto

David Hall Points 17450

Les tâches suivantes sont effectuées très régulièrement par mon équipe à l'aide de PowerShell

  • la liste de la mémoire disponible sur tous les nœuds de nos clusters Hyper-V.
  • Gérer un filer Netapp
  • Approvisionnement de nouvelles machines virtuelles Hyper-V
  • Écrire et lire dans les listes SharePoint de manière programmatique

Au quotidien, j'ai une invite PS en permanence et je l'utilise pour toutes les tâches ponctuelles pour lesquelles j'avais l'habitude d'utiliser CMD.

Voici quelques exemples de code pour lire les listes Sharepoint. J'utilise les services web de Sharepoint et la nouvelle cmdlet "New-WebServiceProxy" dans PowerShell V2.0.

$url = "http://server/sites/site/_vti_bin/lists.asmx"
$listWebService = new-webServiceProxy -uri $url -UseDefaultCredential
$listName = "MyList"
$viewGuid = $null
$query= $null
$viewFields = $null
$numRowsReturned = 20000
$queryOptions = $null
$result = $listWebService.GetListItems($listName,$ViewGuid,$query,$viewFields,$numRowsReturned,$queryOptions,$null)

Oisin Grehan a une excellent article de blog sur l'utilisation de Sharepoint Web Services que j'ai utilisé comme base pour créer toutes mes fonctions. Il a même un superbe script new-webservice.ps1 script que vous pouvez utiliser si vous utilisez encore PowerShell V1.

Voici également la fonction de base que j'ai utilisée pour obtenir la mémoire disponible sur les nœuds de mon cluster

Function Get-AvailableMemory {
param
(
[string[]]
$servers
)
BEGIN {
$query = "select AvailableBytes,__SERVER from Win32_PerfRawData_PerfOS_Memory"

$availableMemory = @{
                    Name="AvailableMemory";
                    Expression = {[math]::round($_.AvailableBytes/1gb,2)}
                    }
$serverName = @{  
                Name ="Server";
                Expression = {$_."__SERVER"}                                      
               }
}
PROCESS {
foreach ($server in $servers){
    get-wmiobject -query $query -computer $server |
    select-object $availableMemory, $serverName
    }
}

END {}    

}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X