Frage Power Shell? Benutzt du es? Kannst du mir ein paar coole Systemverwaltungs-Dinge zeigen, die ich damit machen kann? [geschlossen]


Ich lese überall weiter Power Shell ist der Weg der Zukunft. Als es zum ersten Mal veröffentlicht wurde, habe ich eine ganze Reihe von virtuellen Labs gemacht, aber seitdem habe ich es noch nicht in einer Produktionsumgebung verwendet. Ich weiß, dass der Tag kommen wird, an dem ich mit OS's arbeite, wo es bereits installiert ist, also möchte ich bereit sein.

Ich möchte gerne wissen:

  1. Benutzt du es?
  2. Was war Ihr Bootstrapping-Prozess für die Verwendung von PowerShell?
  3. Welche Art von Systemadministrationsaufgaben haben Sie damit geschrieben?
  4. Ich bin ein SQL Server-Datenbankadministrator. Was sind einige coole Dinge damit zu tun?

Es scheint, dass alle zustimmen, dass Microsoft so hart drängt, aber niemand nutzt es tatsächlich noch. Ich möchte von Systemadministratoren da draußen hören, die es verwenden, um jeden Tag Aufgaben zu erledigen und einige Codebeispiele zu teilen.


44
2018-05-28 05:53


Ursprung


JScript ist tot? - Sophie Alpert
Versuche, beim nächsten Mal kein Troll mit deinen irreführenden Schlagzeilen zu sein. - Jaykul
Vielleicht liegt es daran, dass ich manchmal Wunsch es würde wie ein Buch verschwinden. Ist es nur ich oder ist es sehr hässlich und wortreich? - Nick Kavadias


Antworten:


Microsoft tut alles, um PowerShell zur Wahl von Power-Usern und Automatisierungsautoren zu machen. Vorbei sind die Tage des Kompilierens von Code in .NET, um das Gleiche zu tun, jetzt brauchen Sie nur notepad.exe und google. Wir sind große Fans davon im Büro, insbesondere da die Exchange 2007-Managementkonsole NICHT alles enthält, was Sie in PowerShell tun können. Microsoft hat es absichtlich versäumt, Dinge umzusetzen, die nur einmal innerhalb kurzer Zeit erledigt werden, einfacher zu entwickeln, was seine Verwendung geradezu zwingt, wenn Sie etwas haben, das einer komplexen Umgebung ähnelt.

Die Verwaltung der neueren Produktgeneration von Microsoft (Win7, Windows Server 2008, Exchange 2007/2010, SQL Server 2008) verfügt über sehr umfangreiche PowerShell-Hooks. Sobald Remote Powershell (PowerShell 2.0 IIRC) mit Server 2008 R2 bereitgestellt wird, wird es für Automatisierungsautoren noch nützlicher.

Was wir damit gemacht haben:

  • Erstellen Sie eine Webseite, um bestimmte Administratoraufgaben an Helpdesk-Benutzer zu delegieren. Die Webseite löst Befehle aus, die in PowerShell ausgeführt werden. Dinge, die es tut:
    • Erstellen und löschen Sie Benutzerkonten, einschließlich der Bereitstellung von Exchange 2007-Postfächern und Basisverzeichnissen
    • Entsperrt gesperrte Konten
    • Erstellen / löschen Sie Gruppen
    • Hinzufügen / Entfernen von Benutzern aus Gruppen
    • Verschieben Sie Benutzer zwischen Mail-Stores
    • Legen Sie Passwörter fest
  • Nehmen Sie Auszüge aus dem ERP-System und pushen Sie globale Adressbuchdaten jeden Abend in Active Directory.
  • Lösen Sie das LegacyExchangeDN-Problem, das bei unserer Migration von Exchange 2003 zu Exchange 2007 auftrat. Ich musste allen Benutzern, die in Exchange 2003 waren, eine X500-Adresse hinzufügen. Ein relativ kurzes PowerShell-Skript behob es.
  • Skriptgesteuerte Erstellung von "Gruppenpostfächern" (freigegebene Postfächer in Exchange, bei denen mehrere Benutzer Zugriff auf das Postfach haben), ein ansonsten manueller Prozess aufgrund der Art der Daten, die wir benötigen, bevor wir ihn starten. Es hat die Einrichtung dieser Postfächer stark standardisiert.
  • Erstellt ein Skript, das alle Domänencomputer durchläuft, einen bestimmten Registrierungsschlüssel zurücksetzt und einen Dienst neu startet. Es hat 18 Stunden gedauert, bis es fertig war, aber es hat den Job erledigt.

Also, PowerShell wird für einige Zeit bei uns sein.

BEARBEITEN: Hinzufügen eines Codebeispiels, da es angefordert wurde

$ list = import-csv ("groupusers.csv")
$ lastseengroup = $ list [0] .group
$ ADGroupPrefix = "grp.netware."
$ ADGroupSuffix = "{redacted - im Format von, ou = Gruppen, dc = Domäne, dc = Domäne, dc = Domäne}"
Mitgliederliste für eindeutige Variablen
Clear-Variable unknownusers
foreach ($ Eintrag in $ Liste) {
    if ($ ($ entry.group) -ne $ lastseengroup) {
        echo "stolperte über die neue Gruppe $ ($ entry.group) und übertrug die Änderungen in $ lastseengroup"
        $ newgroup = $ ADgroupPrefix + $ lastseengroup
        $ newgroupdn = '"' +" cn = $ neue Gruppe $ ADGroupSuffix "+ '"'
        echo "DN für $ newgroup bekommen"
        $ existinggroup = dsquery group domainroot -name $ newgroup
        if (($ existinggroup -ne $ null)) {
            dsmod group $ newgroupdn -chmbr $ Mitgliederliste
        } sonst {
            dsadd-gruppe $ newgroupdn -scope u -secgrp ja -mitglieder $ memberlist -desc "Von eDirectory importierte Gruppe"
        }
        Mitgliederliste für eindeutige Variablen
    }
    $ User = get-user $ ($ entry.member) -ErrorAction SilentlyContinue
    if ($ Benutzer.isvalid) {
        $ UserDN = $ Benutzerdefinierter Name
        $ memberlist = $ memberlist + '"' +" $ UserDN "+ '"'
    } sonst {
        $ unknownusers = $ unknownusers + $ ($ entry.member)
    }
    $ lastseengroup = $ ($ entry.group)

}
dsadd-Gruppe "cn = $ ADGroupPrefix $ lastseengroup $ ADGroupSuffix" -scope u -secgrp yes -mitglieder $ memberlist

Dies nimmt eine CSV-Datei, die mit einem Perl-Skript erstellt wurde, und aktualisiert eine Gruppe von Gruppen. Wenn die Gruppe bereits existiert, ersetzt sie die Mitgliedschaft durch die in der Datei angegebene. Wenn die Gruppe nicht existiert, wird sie erstellt. Dies ist eine Einweg-Synchronisierung. Ebenfalls nicht ziemlich in der Produktion noch, aber nah.


34
2018-05-28 04:26



Remote-Powershell !! Du meinst wie ssh!?! über die Zeit! - Nick Kavadias
Wie führen Sie Powershell-Skripte von einer Website aus? Verwenden Sie Powershell-Skripte als Web-Programmiersprache? Verwenden Sie PowershellASP? führen Sie Ihre Skripte als IIS-Benutzer aus? - quentin


Vorausgesetzt, die Serverprodukte von Microsoft werden von Anfang an PowerShell-fähig sein (ich glaube, die nächste Version von Exchange hat alles config über PowerShell verfügbar), und das mag Bücher PowerShell in der Praxis Beschreibe einige großartige Möglichkeiten, um ansonsten monotone Aufgaben zu automatisieren. Ich denke, es ist vernünftig, vorzuschlagen, dass PowerShell noch eine Weile eine vorherrschende Technologie im Windows-Serverland sein wird.


17
2018-05-28 09:15



Dieses Buch ist noch in der Beta / wird geschrieben - Nick Kavadias
Ja, es ist - aber Sie können es jetzt immer noch kaufen und bekommen frühzeitig Zugriff auf die Inhalte. Und da sind Tonnen von Server-Wartungsarbeiten drin :) - moobaa
Exchange ist seit Exchange 2007 PowerShell. OCS wird in der nächsten Version vollständig PowerShell-fähig sein. Die meisten System Center-Produkte unterstützen sie entweder vollständig oder in den nächsten Versionen. PowerShell geht nirgendwohin. - paulr


Ich würde es empfehlen Scott Hanselmans Podcast # 162. Es sieht so aus, als ob alle Microsoft-Server-Teams "gezwungen" sind, PowerShell-Cmdlets bereitzustellen und einer einheitlichen Syntax zu folgen.

Auch Dritte mögen VMWare nehmen es an

Kurz gesagt, PowerShell, das mit 2.0 beginnt, ist ernsthaft daran interessiert, Batchdateien für alle außer den einfachsten Aufgaben zu ersetzen.


12
2018-05-28 04:31





Zehn PowerShell-Skripts, die ich als SQL Server-Datenbankadministrator verwende (alle werden beschrieben / veröffentlicht) mein Blog):

  1. Überprüfen Sie den Speicherplatz auf allen SQL Servern und laden Sie Daten in eine SQL-Tabelle
  2. Führen Sie Berechtigungsberichte auf allen Produktions-SQL-Servern aus und laden Sie Daten in eine SQL-Datenbank
  3. Entdecke alles Windows Server 2003 Cluster, Knoten und virtuelle Elemente im Netzwerk und laden Sie in SQL-Tabellen
  4. Entdecken Sie alle Datenbanken auf allen SQL Servern wie in definiert SCCM und in eine SQL-Tabelle laden
  5. Erstellen Sie eine SQL Server-Sicherungs-Scorecard, indem Sie Sicherungsinformationen über alle SQL Server in eine SQL-Tabelle laden
  6. Stellen Sie sicher, dass TCP Offload Engine in Windows Server 2003 SP2 deaktiviert ist (dies ist ein Leistungseinbußen für viele SQL Server)
  7. Überprüfen Sie die Ausrichtung der Festplattenpartition (auch ein Performance-Killer, wenn Festplatten nicht richtig ausgerichtet sind)
  8. Kopieren Sie SQL-Tabellen von einem Server zu einem anderen
  9. Recursivley alle kopieren SSIS Pakete, die einen MSDB-Speicher von einem Server zum anderen verwenden, einschließlich Ordnerstruktur
  10. Erstellen Sie meinen eigenen Abhängigkeitsbetrachter für grafische Objekte

10
2018-05-28 04:42





Welche Art von Admin-Aufgaben haben Sie damit geschrieben?

Application / Service Monitoring: Holen Sie sich Kennzahlen aus (remoten) EventLog und Stored Procedures und zeigen Sie diese aus einer einzigen Batch-Datei an

Ich bin ein SQL Server DBA, zeigen Sie mir ein paar coole Dinge damit zu tun?

automssqlbackup: tägliche Sicherung für MSSQL mit Rotation (täglich = inkrementell, wöchentlich + monatlich = voll; 5 täglich, 5 wöchentliche Sicherungen), Zippen, E-Mail-Benachrichtigung


8
2018-05-28 09:39



+1 für die Automatisierung des gesamten MSSQL-Sicherungsprozesses. - Andrei Rinea
Yep ... Powershell ist reines Gold für die Automatisierung komplexer Backups in SQL Server. Wir verwenden es, um stündliche Backups zu komprimieren und zu verschlüsseln. Anschließend senden wir die Dateien zur externen Speicherung an Amazon S3: Codeblog.theg2.net/2010/02/... - Greg Bray


Nachdem ich in einer früheren Karriere Unix-Shell-Skripte verwendet und dann zur Windows-Server-Administration gewechselt habe, kann ich sagen, dass ich Powershell wirklich sehr schätze - ich habe weder Zeit noch Fähigkeit, zu viel arkane Syntax zu lernen und war angenehm überrascht Powershell-Skripte können mit sehr einfachen Sprache geschrieben werden ... nimm das, was es wert ist, wie ich ksh gewohnt war !!

Ich sage voraus, dass es für eine lange Zeit sein wird.


7
2018-05-29 18:14





Ich fand das cool: Mit SQL Server 2008 erhalten Sie neue PowerShell-Erweiterungen, mit denen Sie wie Ihr lokales Dateisystem oder Ihre Registry in SQL-Datenbanken navigieren können.

Nach der Installation der SQL Server Client Tools können Sie jede Datenbank in PowerShell (über das Kontextmenü) öffnen und objektorientiert damit spielen:

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)}

Beachten Sie, dass die erste Zeile die Eingabeaufforderung so ändert, dass sie nicht so lang ist.

Hoffentlich abgesehen davon ist es offensichtlich, was hier vor sich geht :)


7
2018-05-28 09:04



+1 Wow, das ist ziemlich nützlich. Vielen Dank! - jftuga


SQL Server 2008 verfügt jetzt in Management Studio über PowerShell-Kontextoptionen, die sich mehr als Exchange nutzen lassen. Stellen Sie es sich auch als Ersatz für DOS vor, denn das ist genau das, was MS dachte, da sie die Sicherheit von DOS nicht verbessern können, um Probleme mit der Abwärtskompatibilität zu lösen. Sie haben also etwas neues und wammo erstellt, Problem gelöst!


5





Ich bin auch ein DBA, und lange Zeit Scripter, zurück zu DOS-Batch-Dateien, V3.3! Weiter zu VB Script, aber PS ist sehr mächtig. Schauen Sie sich an - Sorry, ich kann den Link nicht posten, da ich ein neuer Benutzer bin. Hab das von Otto Helwegs Blog bekommen. Es ist ein billiges und fröhliches Softwareinventar-Tool.

  • 1- Zieht die Liste der Computer, die von einer Datenbanktabelle abgefragt werden sollen
  • 2- Fügt dem Ergebnis die aktuellen Daten und die Uhrzeit hinzu
  • 3- Nimmt die Prüfergebnisse in einer Datenbank auf

Beispiel für ein PowerShell-Skript:

# 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


4