====== Powershell ====== Display Powershell Version $PSVersionTable.PSVersion If the variable does not exist, it is safe to assume the engine is version 1.0. Ausgabe aus mehreren Befehlen zusammen Get-VM | Get-NetworkAdapter | Where-object {$_.Type -ne "Vmxnet3"} | Select @{N="VM";E={$_.Parent.Name}},Name,Type ===== Windows Powershell ===== ==== Remote Session ==== Enter-PSSession -ComputerName $computerName -Credential user@domain.local $cred = Get-Credential user@domain.local Enter-PSSession -ComputerName $computerName -Credential $cred ==== Get Registry Value ==== Get-ItemPropertyValue "$path" -name "$key" ==== Log Date ==== Write-Host (get-date).DateTime ==== Delete RAW if no matching JPG exists ==== Get-ChildItem *.arw | % { if (-not (Test-Path $_.Basename+".jpg")) {Remove-Item $_} } ==== Drucker Migration ==== Drucker von altem Printserver zu neuem Printserver migieren inklusive Standarddrucker. $Printers = Get-WmiObject win32_printer $oldPrintserver = "svrv-print" # OLD Printserver !Hostname! $newPrintserver = "print" # New Printserver !Hostname! foreach($oldPrinter in $Printers) { Write-Host "Bearbeite Drucker: "$oldPrinter.Name if( $oldPrinter.Name.StartsWith("\\$oldPrintserver") ) { Write-Host "Migriere Drucker: "$oldPrinter.Name $pos = $oldPrinter.Name.LastIndexOf("\") $PrinterHost = $oldPrinter.Name.Substring(0, $pos) $PrinterName = $oldPrinter.Name.Substring($pos+1) Write-Host "Verbinde Drucker \\$newPrintserver\$PrinterName" $WMIPrinter = [WMIClass]"\\.\root\cimv2:Win32_Printer" $res = $WMIPrinter.AddPrinterConnection("\\$newPrintserver\$PrinterName") $newPrinter = Get-WMIObject -query "Select * From Win32_Printer Where Name = '\\\\$newPrintserver\\$PrinterName'"; if($newPrinter) { if($oldPrinter.Default) { Write-Host "Setzte Standarddrucker: \\$newPrintserver\$PrinterName" $newPrinter.SetDefaultPrinter() } Write-Host "Lösche Drucker: "$oldPrinter.Name $oldPrinter.Delete() }else{ Write-Host "Fehler beim Verbinden. "$oldPrinter.Name" wurde nicht gelöscht." } } } Write-Host "Press any key to continue ..." $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") ===== Active Directory ===== ==== Gesperrte Benutzer ==== Import-Module activedirectory Search-ADAccount –LockedOut Search-ADAccount -LockedOut | Unlock-ADAccount ==== Alte Computerkonten finden ==== $then = (Get-Date).AddDays(-60) # The 60 is the number of days from today since the last logon. Get-ADComputer -Property Name,lastLogonDate -Filter {lastLogonDate -lt $then} Set-ADComputer -Enabled $false ===== Exchange ===== Die Powershell und auch die Exchange-Verwaltungsshell nutzen s.g. Cmdlets. Diese setzt sich aus einem Verb und einem Hauptwort zusammen. Zum Beispiel ''Get-Mailbox'' oder ''Set-Mailbox''. Die Exchnage CMDlets funktionieren nur in der Exchange-Verwaltungsshell und nicht in der normalen Powershell. ==== Postfach durch E-Mail Adresse finden ==== Folgender Befehlt gibt alle Postfächer aus, welche die Zeichenfolge "NACHNAME" in einer der zugewiesenen Email-Adressen enthalten. Get-Mailbox -filter "EmailAddresses -like '*NACHNAME*'" Name Alias ServerName ProhibitSendQuota ---- ----- ---------- ----------------- NACHNAME, V. (ABT) nachname mailserver unlimited Um nicht nur eine kurze tabelarische Übersicht über diese Postfächer zu bekommen, sondern alle jeweiligen Details anzuzeigen wird ''| format-list'' an den Befehl gehängt. Get-Mailbox -filter "EmailAddresses -like '*NACHNAME*'" | format-list Database : MAILERVER\SG1\SG1DB01 DeletedItemFlags : DatabaseDefault UseDatabaseRetentionDefaults : True RetainDeletedItemsUntilBackup : False [...] Name : Nachname, V. (Abt.) DistinguishedName : CN=Nachname\, V. (Abt.),OU=OU-User,DC=Domain,DC=TLD Identity : Domain.TLD/OU-User/Nachname, V. (Abt.) Guid : f5ef952f-b491-443f-a392-e3617731c48f ObjectCategory : Domain.TLD/Configuration/Schema/Person ObjectClass : {top, person, organizationalPerson, user} WhenChanged : 24.03.2010 11:06:27 WhenCreated : 01.04.2008 11:53:17 Ein alternativer, aber sehr unperformater, Lösungsweg ist der folgende. Zuerst werden alle Postfächer ausgelesen und im nachhinein gefiltert. Je mehr Postfächer man hat um so länger dauert der Befehl dann natürlich. Auch hier kann mit ''| format-list'' eine detailierter Ansicht erzeugt werden Get-Mailbox | where {$_.EmailAddresses -match "NACHNAME"} Name Alias ServerName ProhibitSendQuota ---- ----- ---------- ----------------- NACHNAME, V. (ABT) nachname mailserver unlimited ==== Getrennte Mailboxen auflisten ==== Anders als in der Onlinehilfe beschrieben, tauchen getrennte Mailboxen oft nicht von selbst im Zweig “Getrenntes Postfach” der Verwaltungskonsole auf. Ähnlich wie in den Vorgängerversionen kann man Exchange dann auffordern, nach den Mailboxen zu suchen. Hierzu verwendet man in der Exchange-Shell folgendes Kommando: Clean-MailboxDatabase "Name-der-Datenbank" Danach sollten die getrennten Mailboxen auch im GUI sichtbar sein. Um diese direkt per PowerShell aufzulisten, eignet sich folgendes Kommando: Get-MailboxStatistics -server SERVERNAME | Where {$_.DisconnectDate -ne $null} Wichtig ist dabei der Servername – die TechNet-Dokumentation gibt das leider falsch an. Getrennte Mailboxen entstehen, wenn man eine Mailbox von dem zugehörigen AD-Benutzerkonto trennt (Befehl “Deaktivieren” in der Konsole bzw. “Disable-Mailbox” in der Shell). Im Gegensatz zum Entfernen einer Mailbox bleibt das AD-Benutzerkonto hierbei erhalten. Quelle: http://www.faq-o-matic.net/2010/03/31/exchange-2010-getrennte-mailboxen-auflisten/ ==== Postfachgrößen ==== Postfachgröße eines bestimmten Postfachs Get-MailboxStatistics kragem | ft DisplayName, ItemCount, TotalItemSize -AutoSize DisplayName ItemCount TotalItemSize ----------- --------- ------------- Nachname, V. 130 16402905B Müller, F. 2 27172B Postfachgrößen aller Postfächer sortiert und in Größe in MB Get-MailboxDatabase | Get-MailboxStatistics | Sort-Object -Descending -Property TotalItemSize | ft DisplayName, ItemCount, @{Expression={$_.TotalItemSize.Value.ToMb()};label="Size(MB)"} -autosize DisplayName ItemCount Size(MB) ----------- --------- -------- Nachname, V. 9170 1081 Müller, F. 1224 935 Postfachgrößen als CSV (Komma) exportieren Get-MailboxStatistics | Select-Object DisplayName, LastLogonTime, LastLogoffTime, ItemCount, TotalItemSize, @{Expression={$_.TotalItemSize.Value.ToMb()}} | export-csv \\server\temp\export.txt -notype ==== Datenbank ==== Übersicht über Datenbanken und deren Größe. Get-MailboxDatabase -Status | ft name,server,databasesize ==== Postfach ==== Postfach suchen Get-Mailbox -filter "EmailAddresses -like '*NACHNAME*'" Getrennte Mailboxen auflisten Get-MailboxStatistics -server SERVERNAME | Where {$_.DisconnectDate -ne $null} Mailbox Cleanup um getrennte Postfächer sofort in der GUI anzuzeigen Clean-MailboxDatabase "Name-der-Datenbank" Postfachgröße Get-MailboxStatistics kragem | ft DisplayName, ItemCount, TotalItemSize -AutoSize Postfachgrößen aller Postfächer sortiert und in Größe in MB Get-MailboxDatabase | Get-MailboxStatistics | Sort-Object -Descending -Property TotalItemSize | ft DisplayName, ItemCount, @{Expression={$_.TotalItemSize.Value.ToMb()};label="Size(MB)"} -autosize Postfachgrößen als CSV (Komma) exportieren Get-MailboxStatistics | Select-Object DisplayName, LastLogonTime, LastLogoffTime, ItemCount, TotalItemSize, @{Expression={$_.TotalItemSize.Value.ToMb()}} | export-csv \\server\temp\export.txt -notype ==== Postfachfunktionen ==== Postfächer mit Active Sync Get-CASMailbox | where {$_.ActiveSyncEnabled -eq $true } Postfächer mit OWA Get-CASMailbox | where {$_.OWAEnabled -eq $true } ==== Geräte ==== Alle Geräte-Details anzeigen Get-ActiveSyncDevice | fl UserDisplayName, DeviceId, DeviceType, DeviceModel, DeviceOS, FriendlyName, Name, DeviceAccessState Alle Geräte-Details einer Mailbox anzeigen Get-ActiveSyncDevice -Mailbox "kragem" | fl UserDisplayName, DeviceId, DeviceType, DeviceModel, DeviceOS, FriendlyName, Name, DeviceAccessState Alle Geräte einer Mailbox anzeigen mit LastSync Datum. Alte Geräte oben. Get-ActiveSyncDeviceStatistics -Mailbox "kragem" | fl DeviceID, DeviceType, DeviceModel, FirstSyncTime, LastSuccessSync Alte Geräte finden Get-ActiveSyncDevice -Result Unlimited | Get-ActiveSyncDeviceStatistics | Where {$_.LastSuccessSync -le (Get-Date).AddDays("-30")} | fl DeviceID, DeviceType, DeviceModel, FirstSyncTime, LastSuccessSync, Identity zum löschen der Geräte statt an ''Format-List'' an ''Remove-ActiveSyncDevice'' pipen oder manuell löschen Device manuell über ID löschen (Achtung: Wird aus allen evtl. aktiven Mailboxen gelöscht!) Get-ActiveSyncDevice | where {$_.DeviceId -eq "1140B5A5508D422741F2E87CE114E115"} | Remove-ActiveSyncDevice Device aus bestimmter Mailbox löschen (über Identity) Get-ActiveSyncDevice | where {$_.Identity -eq "Marien-kh.MKH/Haus/Hilsmann, M. (PDL)/ExchangeActiveSyncDevices/iPhone§O9VKDO3G7D3HJ0V8JQ9V0TSTGO"} | Remove-ActiveSyncDevice http://technet.microsoft.com/en-us/library/bb266947(v=exchg.141).aspx Set-CasMailbox pponzeka –ActiveSyncAllowedDeviceIDs number1,number2 Set-CasMailbox pponzeka –ActiveSyncAllowedDeviceIDs:$null ==== Zertifikat erneuern ==== TODO To renew the certificate perform following steps: Open Exchange Management Shell Check status of existing certificate(s). Make note of the "Thumbprint" value: Get-ExchangeCertificate | List Get a new self-signed certificate. Use "Thumbprint" from the old certificate: Get-ExchangeCertificate –thumbprint "C9A4BB6094A167BD324618D8492C4C5281FDD34A" | New-ExchangeCertificate Examine properties of the new certificate. Make sure all required services are enabled. Get-ExchangeCertificate | List If some of the required services are not enabled you can enable them with following cmdlet (Use "Thumbprint" from the new certificate): Enable-ExchangeCertificate -thumbprint "A0BB986024A347BAC24438D8432C1B123AFDF11B" -services IIS, POP, SMTP, IMAP Ensure that all required services are working with new certificate and then remove the old certificate: Remove-ExchangeCertificate -thumbprint "C9A4BB6094A167BD324618D8492C4C5281FDD34A" ===== VMware===== ==== RDM + LUN ID ==== $RDMs = @() foreach($vm in (Get-View -ViewType "VirtualMachine")) { foreach($dev in ($vm.Config.Hardware.Device | where {($_.gettype()).Name -eq "VirtualDisk"})) { if(($dev.Backing.CompatibilityMode -eq "physicalMode") -or ($dev.Backing.CompatibilityMode -eq "virtualMode")) { $objRdm = "" | select VMName, VMDK, UUID, DiskLabel, SCSIBus, SCSIDevice, Mode $objRdm.VMName = $vm.Name $objRdm.VMDK = $dev.Backing.FileName $objRdm.UUID = $dev.Backing.LunUuid $objRdm.DiskLabel = $dev.DeviceInfo.Label $objRdm.SCSIBus = ( $vm.Config.Hardware.Device | ? { $_.Key -eq $dev.ControllerKey }).BusNumber $objRdm.SCSIDevice = $dev.UnitNumber $objRdm.Mode = $dev.Backing.CompatibilityMode $RDMs += $objRdm } } } foreach ($cluster in (Get-View -ViewType "ClusterComputeResource")) { $vmhostsview = $cluster.host | % { Get-View $_ } $vmhostview = $vmhostsview | Select -first 1 $ScsiLuns = $vmhostsview | % { $_.Config.StorageDevice.ScsiLun } | Select -unique * $UUIDs = $ScsiLuns | Select -unique UUID $Datastores = $vmhostsview | % { $_.Config.FileSystemVolume.MountInfo } | % { $_.Volume } | Select -Unique * $HostLUN = $vmhostsview | % { $_.Config.StorageDevice.ScsiTopology.Adapter } | % { $_.Target | % { $_.LUN } } | Select -unique * foreach ($UUID in $UUIDs) { $Lun = $ScsiLuns | ? { $_.UUID -eq $UUID.UUID } | Select -first 1 $objVolume = "" | Select Cluster, VolumeName, CanonicalName, DisplayName, VolumeType, CapacityGB, BlockSizeMb, VMFSVersion, LunType, Vendor, Model, HostLUN, VM, VMDiskLabel, VMSCSIBus, VMSCSIDevice, Revision, ScsiLevel, UUID $objVolume.Cluster = $cluster.Name $objVolume.CanonicalName = $Lun.CanonicalName $objVolume.HostLUN = ($HostLUN | ? { $_.ScsiLun -eq $Lun.Key } | select -unique LUN).LUN $objVolume.UUID = $Lun.Uuid $objVolume.CapacityGB = $Lun.Capacity.Block * $Lun.Capacity.BlockSize / 1GB $objVolume.DisplayName = $Lun.DisplayName $objVolume.LunType = $Lun.LunType $objVolume.Vendor = $Lun.Vendor $objVolume.Model = $Lun.Model $objVolume.Revision = $Lun.Revision $objVolume.ScsiLevel = $Lun.ScsiLevel foreach ($vol in $Datastores) { if ($vol.extent | % { $_.diskname -eq $Lun.CanonicalName}) { $objVolume.VolumeName = $vol.Name $objVolume.BlockSizeMb = $vol.BlockSizeMb $objVolume.VMFSVersion = $vol.Version $objVolume.VolumeType = "vmfs" } } foreach ($rdm in $RDMs) { if ($Lun.Uuid -eq $rdm.UUID) { $objVolume.VolumeName = $rdm.VMDK $objVolume.VM = $rdm.VMName $objVolume.VMDiskLabel = $rdm.DiskLabel $objVolume.VMSCSIBus = $rdm.SCSIBus $objVolume.VMSCSIDevice = $rdm.SCSIDevice if ($rdm.Mode -eq "virtualMode" ) { $objVolume.VolumeType = "rdm" } if ($rdm.Mode -eq "physicalMode") { $objVolume.VolumeType = "rdmp" } } } $objVolume } } [vSphere PowerCLI] C:\> .\rdm.ps1 | where {$_.HostLUN -match "220"}