Vraag PowerShell? Gebruik je het? Kun je me wat coole systeemadministratie dingen laten zien die ik ermee kan doen? [Gesloten]


Ik blijf overal dat lezen PowerShell is de weg van de toekomst. Toen het voor het eerst werd uitgebracht, heb ik een hele reeks virtuele laboratoria gedaan, maar sindsdien heb ik het nog steeds niet in een productieomgeving gebruikt. Ik weet dat de dag zal komen dat ik te maken heb met OS's waar het al is geïnstalleerd, dus ik wil er klaar voor zijn.

Ik wil het weten:

  1. Gebruik je het?
  2. Wat is uw 'bootstrapping'-proces geweest voor het gebruik van PowerShell?
  3. Wat voor soort systeembeheerstaken heb je ermee geschreven?
  4. Ik ben een SQL Server-databasebeheerder. Wat zijn enkele leuke dingen om ermee te doen?

Het lijkt erop dat iedereen het erover eens is dat Microsoft dit hard pusht, maar niemand gebruikt het nog niet. Ik wil van systeembeheerders daar horen die het gebruiken om dagelijkse taken uit te voeren en sommige codevoorbeelden te delen.


44
2018-05-28 05:53


oorsprong


JScript is dood? - Sophie Alpert
Probeer de volgende keer geen trol te zijn met je misleidende koppen. - Jaykul
Misschien komt het omdat ik soms wens het zou weggaan als jscript. Ligt het aan mij of is het erg lelijk en uitgebreid? - Nick Kavadias


antwoorden:


Microsoft doet er alles aan om PowerShell overal de keuze te laten zijn voor gebruikers van energie en automatisering. Voorbij zijn de dagen van het compileren van de code in .NET om hetzelfde te doen, nu heb je gewoon notepad.exe en google nodig. We zijn er groot fan van op kantoor, vooral omdat de Management Console van Exchange 2007 NIET alles bevat wat u in PowerShell kunt doen. Microsoft is er bewust niet in geslaagd om dingen te implementeren die maar een keer in de zoveel tijd worden gedaan, gemakkelijker om op die manier te ontwikkelen, wat het gebruik ervan absoluut afdwingt als je iets hebt dat lijkt op een complexe omgeving.

Het beheren van de nieuwste generatie producten van Microsoft (Win7, Windows Server 2008, Exchange 2007/2010, SQL Server 2008) hebben allemaal zeer rijke PowerShell-hooks. Zodra Remote Powershell (PowerShell 2.0 IIRC) wordt geïmplementeerd met Server 2008 R2, wordt het nog MEER nuttig voor automatiseringsschrijvers.

Wat we ermee gedaan hebben:

  • Maak een webpagina om bepaalde admin-taken te delegeren aan helpdesk-gebruikers. De webpagina vuurt opdrachten af ​​die worden uitgevoerd in PowerShell. Dingen die het doet:
    • Aanmaken en verwijderen van gebruikersaccounts, inclusief provisioning van Exchange 2007 mailboxen en persoonlijke mappen
    • Ontgrendelt geblokkeerde accounts
    • Groepen maken / verwijderen
    • Gebruikers toevoegen aan of verwijderen uit groepen
    • Verplaats gebruikers tussen mail-winkels
    • Stel wachtwoorden in
  • Neem extracten uit het ERP-systeem en push global-adresboek-gegevens elke nacht in Active Directory.
  • Los het LegacyExchangeDN-probleem op dat zich voordeed bij onze migratie van Exchange 2003 naar Exchange 2007. Moest een X500-adres toevoegen aan iedereen die op Exchange 2003 was. Een vrij kort PowerShell-script repareerde het.
  • Scriptscreatie van "groepsmailboxes" (gedeelde mailboxen in Exchange waar meerdere gebruikers toegang hebben tot de mailbox), een anderszins handmatig proces vanwege de aard van de gegevens die we nodig hebben voordat we het kunnen starten. Het heeft de instelling van deze mailboxen sterk gestandaardiseerd.
  • Creëerde een script dat door alle domeinexperimenten liep en een specifieke registersleutel opnieuw instelde en een service herstartte. Het duurde 18 uur om te voltooien, maar het klopte.

Dus ja, PowerShell zal nog geruime tijd bij ons zijn.

BEWERK: Een codevoorbeeld toevoegen, omdat dit is aangevraagd

$ List = import-csv ( "groupusers.csv")
$ Lastseengroup = $ lijst [0] .Group
$ ADGroupPrefix = "grp.netware."
$ ADGroupSuffix = "{geredigeerd - in het formaat van, ou = groepen, dc = domein, dc = domein, dc = domein}"
Duidelijke-variabele ledenlijst
Duidelijke variabele unknownusers
foreach ($ entry in $ list) {
    if ($ ($ entry.group) -ne $ lastseengroup) {
        echo "strompelde over nieuwe groep $ ($ entry.group), wijzigde wijzigingen naar $ lastseengroup"
        $ Newgroup = $ ADgroupPrefix + $ lastseengroup
        $ Newgroupdn = ' " '+ "cn = $ newgroup $ ADGroupSuffix" +'"'
        echo "DN krijgen voor $ nieuwe groep"
        $ existinggroup = dsquery group domainroot -name $ newgroup
        if (($ existinggroup -ne $ null)) {
            dsmod group $ newgroupdn -chmbr $ ledenlijst
        } else {
            dsadd group $ newgroupdn -scope u -secgrp yes -members $ member-lijst "Group geïmporteerd uit eDirectory"
        }
        Duidelijke-variabele ledenlijst
    }
    $ User = get-user $ ($ entry.member) -ErrorAction SilentlyContinue
    if ($ User.isvalid) {
        $ UserDN = $ User.distinguishedname
        $ memberlist = $ memberlist + '"' +" $ UserDN "+ '"'
    } else {
        $ Unknownusers = $ unknownusers + $ ($ entry.member)
    }
    $ Lastseengroup = $ ($ entry.group)

}
dsadd group "cn = $ ADGroupPrefix $ lastseengroup $ ADGroupSuffix" -scope u -secgrp yes -members $ ledenlijst

Hiervoor is een CSV-bestand nodig dat is gemaakt met een perl-script en wordt een reeks groepen bijgewerkt. Als de groep al bestaat, vervangt deze het lidmaatschap door het lidmaatschap dat in het bestand is opgegeven. Als de groep niet bestaat, wordt deze gemaakt. Dit is een synchronisatie in één richting. Ook niet heel in productie nog, maar dichtbij.


34
2018-05-28 04:26



verre powershell !! je bedoelt als ssh!?! werd tijd! - Nick Kavadias
Hoe voer je powershellscripts uit vanaf een website, gebruik je powershell-scripts als programmeertaal voor het web? gebruikt u powershellASP? Gebruikt u uw scripts als IIS-gebruiker? - quentin


Gezien het feit dat de serverproducten van Microsoft vanaf het begin PowerShell-ingeschakeld zullen zijn (ik geloof dat de volgende versie van Exchange dit heeft) allemaal configuratie beschikbaar via PowerShell) en boeken zoals PowerShell in de praktijk beschrijven enkele geweldige manieren om anders eentonige taken te automatiseren, ik denk dat het redelijk is om te suggereren dat PowerShell al een tijdje een veel gebruikte technologie is in Windows Serverland.


17
2018-05-28 09:15



dat boek is nog in bèta / geschreven - Nick Kavadias
Ja, dat is het - maar u kunt het nu nog steeds kopen en krijgt vroeg toegang tot de inhoud. En er zijn daar heel veel dingen om de server te onderhouden :) - moobaa
Exchange is sinds de introductie van Exchange 2007 allemaal PowerShell. OCS zal volledig PowerShell-geschikt zijn in de volgende release; de meeste System Center-producten ondersteunen het volledig of staan ​​in hun volgende releases. PowerShell gaat nergens heen. - paulr


Ik zou aanraden Scott Hanselman's Podcast # 162. Het lijkt erop dat alle Microsoft-serverteams "gedwongen" zijn om PowerShell-cmdlets te leveren, en ook om één consistente syntaxis te volgen.

Ook, zoals derden VMWare zijn het aan het adopteren

Kortom, ik geloof dat PowerShell vanaf 2.0 serieus bezig is met het vervangen van batchbestanden voor alle, behalve de meest triviale taken.


12
2018-05-28 04:31





Tien PowerShell-scripts die ik gebruik als een SQL Server-databasebeheerder (alle worden beschreven / gepost op mijn blog):

  1. Controleer de schijfruimte op alle SQL-servers en laad gegevens naar een SQL-tabel
  2. Voer machtigingsrapporten uit over alle productie-SQL-servers en laad gegevens naar een SQL-database
  3. Ontdek alles Windows Server 2003 clusters, knooppunten en virtuals op netwerk- en load-naar-SQL-tabellen
  4. Ontdek alle databases op alle SQL-servers zoals gedefinieerd in SCCM en laad naar een SQL-tabel
  5. Maak een back-upscorecard voor SQL Server door back-upinformatie over alle SQL-servers naar een SQL-tabel te laden
  6. Controleer of TCP Offload Engine is uitgeschakeld in Windows Server 2003 SP2 (dit is een prestatiekiller voor veel SQL-servers)
  7. Controleer de uitlijning van schijfpartities (ook een prestatiemoordenaar als schijven verkeerd zijn uitgelijnd)
  8. SQL-tabellen kopiëren van de ene server naar de andere
  9. Recursivley alles kopiëren SSIS pakketten met behulp van een MSDB-opslag van de ene server naar de andere, inclusief mapstructuur
  10. Maak mijn eigen grafische objectafhankelijkheidsviewer

10
2018-05-28 04:42





Met wat voor soort admin-taken heb je er een script van gemaakt?

applicatie / service monitoring: haal sleutelprestatienummers uit (remote) EventLog en Opgeslagen Procedures en toon ze uit een enkel batchbestand

Ik ben een SQL Server DBA, laat me wat leuke dingen zien die ermee te maken hebben?

automssqlbackup: dagelijkse back-up voor MSSQL met rotatie (dagelijks = incrementeel, wekelijks + maandelijks = vol; houd 5 dagelijks, 5 wekelijkse back-ups), zippen, e-mailkennisgeving


8
2018-05-28 09:39



+1 voor het automatiseren van het volledige MSSQL-back-upproces. - Andrei Rinea
Yep ... Powershell is puur goud voor het automatiseren van complexe back-ups in SQL Server. We gebruiken het om uurlijkse back-ups te comprimeren en coderen en vervolgens de bestanden naar de Amazon S3 te sturen voor opslag op externe locaties: codeblog.theg2.net/2010/02/... - Greg Bray


Nadat ik in een vorige carrière unix-shellscripts heb gebruikt en daarna naar Windows Server-administratie ben gegaan, kan ik zeggen dat ik PowerShell echt heel erg waardeer - ik heb geen tijd of het vermogen om te veel geheimzinnige syntax te leren en was aangenaam verrast dat veel van powershellscripts kunnen met een zeer eenvoudige taal worden geschreven ... neem dat wat het waard is zoals ik gewend was aan ksh !!

Ik voorspel dat het nog lang zal bestaan.


7
2018-05-29 18:14





Ik vond dit cool: met SQL Server 2008 krijg je nieuwe PowerShell-uitbreidingen waarmee je door SQL-databases kunt navigeren, net zoals je lokale bestandssysteem of register.

Na het installeren van de SQL Server Client-hulpmiddelen kunt u elke database openen in PowerShell (via het contextmenu met de rechtermuisknop) en ermee spelen op een objectgerichte manier:

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

Merk op dat de eerste regel simpelweg de prompt verandert, zodat deze niet zo lang is.

Hopelijk is het vanzelfsprekend wat hier aan de hand is :)


7
2018-05-28 09:04



+1 Wauw, dit is erg handig. Bedankt! - jftuga


SQL Server 2008 heeft nu PowerShell-contextopties in Management Studio, dus meer dan Exchange omhelst het. Zie het ook als de vervanging voor DOS, want dat is vrijwel wat MS dacht, omdat ze gewoon de beveiliging van DOS voor compatibiliteitsproblemen met eerdere versies niet konden verbeteren, dus creëerden ze gewoon iets nieuws en wammo, probleem opgelost!


5





Ik ben ook een DBA, en een lange tijd scripter, die teruggaat naar DOS-batchbestanden, V3.3! Verplaatst naar VB Script maar PS is dat wel heel krachtig. Kijk eens naar - Sorry, ik kan de link niet plaatsen, omdat ik een nieuwe gebruiker ben. Heb dit van Otto Helweg's Blog. Het is een goedkope en vrolijke tool voor het inventariseren van software.

  • 1- Trekt de lijst met computers die moeten worden opgevraagd vanuit een databasetabel
  • 2- Voegt de huidige gegevens en tijd toe aan het resultaat
  • 3- Registreert de auditresultaten in een database

Voorbeeld 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


4





De volgende taken worden door mijn team op een zeer regelmatige basis uitgevoerd met PowerShell

  • een lijst maken met het beschikbare geheugen op alle knooppunten van onze Hyper-V-clusters.
  • Beheer een Netapp-filer
  • Voorziening van nieuwe Hyper-V virtuele machines
  • Schrijf naar en lees uit SharePoint-lijsten programmatisch

Dagelijks heb ik een PS-prompt de hele tijd in gebruik en gebruik ik deze voor eenmalige taken waarvoor ik CMD gebruikte.

Hier zijn enkele codevoorbeelden voor het lezen van Sharepoint-lijsten. Ik gebruik webservices van Sharepoint en de nieuwe cmdlet "New-WebServiceProxy" in 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 heeft een geweldige blogpost over het gebruik van Sharepoint Web Services die ik als basis gebruikte om al mijn functies te creëren. Hij heeft een geweldig nieuw webservice.ps1-script dat u kunt gebruiken als u nog steeds PowerShell V1 gebruikt.

Ook hier is de basisfunctie die ik gebruikte om het beschikbare geheugen op knooppunten in mijn cluster te krijgen

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

}

3



Heb je een voorbeeldcode die je wilt delen? Ik ben vooral geïnteresseerd in het lezen en schrijven van SharePoint-lijsten. - Brian
Zoet! Bedankt voor de voorbeelden en de link! - Brian


Ik heb PowerShell geprobeerd voor een klein project op het werk - een dagelijkse migratie van een subset van ~ 600 gebruikers en ~ 200 groepen van het bedrijf ADVERTENTIE naar een oud UNIX-systeem met CSV-achtige bestanden. Ik kreeg een 500-lijn aangeboden VBScript script (!) dat een enkele groep en de gebruikers als uitgangspunt heeft getrokken.

Het bleek dat een PowerShell-script van ~ 20 regels het hele ding kon doen ...

Als een * NIX-gebruiker (server- en clientzijde) ben ik zeer aangenaam verrast met PowerShell. Zelfs als je gewoon een kleine subset van commando's kent, kun je er echt krachtig mee werken. Ik heb alleen nodig SSH(-achtige) externe toegang ...


2



opzoeken psremoting - Sam