Objektumorientált,.net-alapú shell, de Kis-nagybetű érzéketlen Variant változók Típushű objektumok, adatok Command és Expression mód Minden adat – collection Távoli futtatás egyelőre nincs Parancssor és PS-Analyzer.PS1 fájlok
Ige-főnév Get-Process, Get-Childitem, Get-Help Stop-Service, Set-Location A paramétereket mindig a shell dolgozza fel Egységes formátum Ha saját parancsot írunk, nem kell paraméterfeldolgozással bíbelődni Wildcard-ready: *, ?, [] Utasítás-zárójel: { } Expression Mode: () Változók: $alma, $_ Egy sorban több parancs: ; Konstansok (1kb, 2mb, 3gb) Pipe: |
Get-Help (-e) Parancsok, Aliasok, Helpek, Providerek Get-Command (get-command | group noun) Parancsok, Aliasok, függvények, alkalmazások Get-Member (get-date | get-member) („asda”.Substring()) A lekérdezett objektumok összes metódusa és tulajdonsága Get-PSDrive Az összes provider, amit be lehet járni DIR-DURR DIR Alias: Kétbetűs aliasok (Set-Location, SL; Stop Process, SP) SQL-jellegű aliasok (SELECT, WHERE) Kompatibilitási aliasok (DIR, LS, CD)
Set-Location (CD) Set-Location C: CD HKLM: SL Cert: CHDIR Env: Get-Childitem (DIR) LS, DIR, GCI
Minden parancs objektumhalmazokkal dolgozik 1, 2, 3, 4 A halmazok tetszőleges és vegyes típusú elemeket tartalmaznak Get-Childitemnél fájlok+könyvtárak vegyesen Dir ; 1, 2, 3, 4 A halmaz egyes elemeit Foreach-Object-tel lehet egyesével kezelni foreach {$_} $_ a halmaz aktuális eleme ( 1..5 | foreach {“blabla$_"}) dir | foreach {$_.LastAccessTime - $_.LastWriteTime}
Munka objektumkupacokkal Select-Object Oszlopok kiválogatása (kivéve –first, -last) Where-Object Sorok kiválogatása {$_} Sort-Object Sorbarendezés Összetett műveletek Az öt legnagyobb olyan fájl, amit 2007-ben módosítottak Group-Object Tetszőleges property alapján Measure-Object Statisztika
Nyalánkságok Fájlkezelés Get-content, set-content.net objektumok statikus metódusainak meghívása [névtér]::Metódus() WMI-objektumok megszólítása Get-wmiobject PowerGadgets
Exchange 2003 (VBScript) E12 (PowerShell one-liner) Mailbox Statistics Set listExchange_Mailboxs = GetObject("winmgmts:{impersonationLevel=impersonate}!\\COMPUTERNAME\ROOT\MicrosoftExchangeV2"). InstancesOf("Exchange_Mailbox") For Each objExchange_Mailbox in listExchange_Mailboxs WScript.echo "AssocContentCount =” + objExchange_Mailbox.AssocContentCount WScript.echo " DateDiscoveredAbsentInDS =” + objExchange_Mailbox.DateDiscoveredAbsentInDS WScript.echo " DeletedMessageSizeExtended =” + objExchange_Mailbox. DeletedMessageSizeExtended WScript.echo " LastLoggedOnUserAccount =” + objExchange_Mailbox. LastLoggedOnUserAccount WScript.echo " LastLogoffTime =” + objExchange_Mailbox. LastLogoffTime WScript.echo " LastLogonTime =” + objExchange_Mailbox. LastLogonTime WScript.echo " LegacyDN =” + objExchange_Mailbox. LegacyDN WScript.echo " MailboxDisplayName =” + objExchange_Mailbox. MailboxDisplayName WScript.echo " MailboxGUID =” + objExchange_Mailbox. MailboxGUID WScript.echo " ServerName =” + objExchange_Mailbox. ServerName WScript.echo " Size =” + objExchange_Mailbox. Size WScript.echo " StorageGroupName =” + objExchange_Mailbox. StorageGroupName WScript.echo " StorageLimitInfo =” + objExchange_Mailbox. StorageLimitInfo WScript.echo " StoreName =” + objExchange_Mailbox. StoreName WScript.echo " TotalItems =” + objExchange_Mailbox. TotalItems Next Nextget-mailboxstatistics –server $servername –server $servername Database Mgmt Dim StorGroup as New CDOEXM.StorageGroup StorGroup.DataSource.Open "LDAP://" + DCServer + "/ CN=First Storage Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName StorGroup.MoveLogFiles("C:\newlogPath", 0) move-storagegrouppath -identity “First Storage -identity “First Storage Group“ Group“ –log "C:\newlogPath” –log "C:\newlogPath” Recipient Mgmt Dim objMailbox As CDOEXM.IMailboxStore Set objMailbox = GetObject("LDAP://" + DCServer + "CN=FOO,CN=users," + DomainName) objMailbox.Creat box "LDAP://" + DCServer + "/CN=Private MDB,CN=First Storage Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName enabl box -identity domain\FOO -identity domain\FOO –database “First Storage –database “First Storage Group\Private MDB” Group\Private MDB”
A cél a rendszergazdai feladatok egyszerűsítése A „Task Model” a felügyeleti funkciók logikus csoportosítása A „task” vagy feladat egy elemi műveletet jelent (pl. move a mailbox) A feladatokat négy csoportba soroljuk: Recipient management tasks Organization management tasks Server management tasks Diagnostic Tasks A feladatok tovább vannak bontva szerverszerepek és funkciók szerint Roles: Edge/Hub Transport, CAS, Mailbox, UM Features: AntiSpam, Managed , Transport, Rules etc.
Az összesen 375 cmdlet teljesen lefeldi az Exchange 2007 rendszerfelügyeletét Kivételek: külső termékek által nyújtott szolgáltatások (IIS, ADUC) és néhány őskövület. Recipient management Distribution group, DDG, Mailboxes, mail-enabled contacts, users, Mailbox Policies, Address Policies Organization settings Transport Rules, Journaling, Routing, Filtering, Managed Folders, Address Lists, OAB, Anti-Spam, ActiveSync, UM Server settings Storage group, mailbox and public folder databases, LCR / HA, Virtual directories, SMTP connectors, POP, IMAP Diagnostics Queue management, test server health, connectivity, BPA
A help parancs segít a cmdletek és kategóriák felderítésében Get-help *User* Get-help -role *UM* Get-help –component *recipient* További részletek... Get-mailbox -? | more Help remove-storagegroup Lássuk, mit is adnak vissza az egyes parancsok? Get-Mailbox TestUser | format-list Get-Mailbox TestUser | fl *quota* A get-member a rendszergazda második (vagy a harmadik?) legjobb barátja Get-storagegroup TestSG | get-member Súgórendszer
Az összes objektum egyedi azonosítóval (Identity) rendelkezik (név, GUID vagy DN) Két objektumcsoport van: Singleton: egypéldányos jószágok Multiple instance: jószág-csokrok, ahol az azonosító tesz különbséget Az “Identity” az objektum létrehozásakor kap értéket new-StorageGroup -name SG1 -server SERVER1 Innentől az Identityjével „találjuk fejbe” set-StorageGroup SG1 -param1 arg1 Az Identityk láncából „útvonal” képezhető URL: “ftp://server/container/resource.exe” Identity: “container\resource1\resource2…” get-MailboxDatabase “Mailbox Store” get-Mailbox redmond\evand remove-AddressList AddressList1\AddressList2 Így aztán nem kell állandóan a tartománynévre és egyéb irreleváns adatokra hivatkozni! Ha valakinek az „kényelmes”, az Identityt megadhatja GUID vagy DN formátumban is
Egy parancs általában visszaadja az összes objektumot, ezt a listát szűrhetjük (kliens): Get-TransportServer | where { $_.MessageTrackingEnabled –eq $false } Dzsóker rulez Get-Mailbox *joe* Get-ExchangeServer *North* Get-SendConnector *.hp.com Egyes parancsok szerveroldali szűréssel is rendelkeznek Get-Mailbox -filter { DisplayName -like ‘*Test*’ }
Egyszerre egy sereg objektum feldolgozása get-StorageGroup | set-StorageGroup -param1 arg1 -param2 arg2 Ugyanazon főnéven belül a csövezés mindig működik (cmd1 | cmd2) Get-Mailbox redmond\evand | remov box... és néha a szavakon túl is... Get-Mailbox redmond\evand | Test-MapiConnectivity Ha nem megy a csövezés, használj “ForEach” parancsot! Get-ExchangeServer | foreach { get-Storagegroup –server $_.Name }
1. Viselj világítós mellényt! 2. Használd a whatif, confirm, verbose kapcsolókat! Az összes cmdlets (a get-* kivételével) tudja a –whatif-et A „gyilkos” parancsok mindig kérdeznek! Hibás/félresikerült objektumok kezelése: Ha „hibás”, üzenetet kapunk …ezt akár kódból mi magunk is ellenőrizhetjük $object = Get-ELCMailboxPolicy ELCp1 if ( $object.IsValid –eq $false ) { $whatsWrong = $object.Validate() $whatsWrong | select-object InvalidData,Description,PropertyDefinition InvalidData,Description,PropertyDefinition} A set-* cmdletekkel gyógyítunk $fixedObject | Set-ManagedFolder
Hát lássuk, értelmezzük! Get-Mailbox -server E12admin | foreach { get-MailboxDatabase $_.Database } | group Name 1..5 | foreach { new-storagegroup -name (“SG $_”) -server E12admin | new-mailboxdatabase “MB” } Get-DistributionGroup newEmployees | get- DistributionGroupMember | enabl box -database newDb1 Get-MessageTrackingLog -MessageSubject "SomeTextFromTheSubject" | Group ClientIP | Select Name | nslookup $_
param( [string]$server = $(read-host "Target server")) new-storagegroup Congress -server $server | out-null new-mailboxdatabase Senate -storagegroup exadmin-mbx-02\Congress | mount-database new-mailboxdatabase House -storagegroup exadmin-mbx-02\Congress | mount-database write-host "Databases created" # get top user $mbxset = (get-mailboxstatistics -server exadmin-mbx-01| sort TotalItemCount -desc)[0..49] $mbxset | foreach{ get-mailbox $_.LegacyDN } | where {$_.Database -like "House*"} | mov box -targetdatabase $server\house | out-null write-host "Representatives moved" $mbxset | foreach{ get-mailbox $_.LegacyDN } | where {$_.Database -like "Senate*"} | mov box -targetdatabase $server\Senate | out-null write-host "Senators moved"
Exchange PowerShell Weblapok, Wiki-k, és Blogok PowerShell Team Blog