Lord of Berlin Aus dem IT Alltag

30Mar/100

PowerCLI cmdlets for vCenter Update Manager

Die PowerCLI Update Manager cmdlets sind da!

Laut einem Blogeintrag im PowerCLI Blog, stellt das neue PowerShell snapin die folgenden 13 cmdlets bereit:

Cmdlet Name Cmdlet Description
Attach-Baseline Attaches baselines to the specified Template, VirtualMachine, VMHost, Cluster, Datacenter, Folder, and VApp objects.

Attaching a baseline to a container object such as a folder or datacenter transitively attaches the baseline to all objects in the container.

Detach-Baseline Detaches baselines from the specified inventory objects.
Download-Patch Downloads new patches into the Update Manager patch repository from the enabled patch download sources.
Get-Baseline Retrieves the baselines specified by the provided cmdlet

parameters.

Get-Compliance Retrieve baseline compliance data for the specified object of type Template, VirtualMachine, VMHost, Cluster, Datacenter, Folder, and VApp.
Get-Patch Retrieves all available patches or those specified by the provided cmdlet parameters.
Get-PatchBaseline Retrieves all  patch baselines or those specified by the provided cmdlet parameters.
New-PatchBaseline Creates a new patch baseline. Patch baselines can be applied to either hosts or virtual machines. Depending on the patch criteria you select, patch baselines can be either dynamic or static (fixed).
Remediate-Inventory Remediates an inventory object against the specified baselines.
Remove-Baseline Deletes the specified baselines from their servers. Before the

removal, the baselines are detached from all entities they have been attached to.

Scan-Inventory Scans inventory objects for baselines attached to them.
Set-PatchBaseline Modifies the properties of a patch baseline. You can specify explicitly the patches you want to include in the baseline through the IncludePatch parameter.
Stage-Patch Initializes staging of patches. Staging allows you to download

patches from the Update Manager server to the ESX/ESXi hosts, without applying the patches immediately


Download und mehr Informationen sind hier zu finden: http://communities.vmware.com/
Release Notes gibt es hier: http://communities.vmware.com/docs/DOC-12075
Das online manual gibt es hier: http://www.vmware.com/

Es wird eine Installation von PowerCLI 4 update 1 benötigt, bevor die Update Manager cmdlets installiert werden.

29Mar/100

disable Mailbox Script

In vielen Unternehmen wird das Usermanagement von der Unternehmenssoftware (z.B. SAP) zum Teil automatisiert übernommen. Dabei werden die Daten der Mitarbeiter aus der Personalabteilung über die Unternehmenssoftware in das Active Directory eingetragen. Dafür gibt es unter anderem den Identity Manager von Microsoft, was aber nicht jetzt Thema sein soll. Beim Ausscheiden von Mitarbeitern tun sich da unter Umständen aber ein paar Lücken auf die man eigentlich vermeiden will.

In einigen Unternehmen gibt es die Policy, dass die Useraccounts nach dem Ausscheiden deaktiviert aufbewahrt werden und erst nach einer bestimmten Frist (z.B. 90 Tage) gelöscht werden. Wenn ein Useraccount deaktiviert wurde, hat der Mitarbeiter eigentlich kein Zugriff auf Daten und Dienste mehr.

Wenn wir uns in der Situation einmal nur auf Exchange und die User Mailbox konzentrieren, müssen wir leider feststellen, dass die Aussage nicht ganz zutrifft. Der Mitarbeiter hat in der Tat nach seinem Ausscheiden mit deaktiviertem Useraccount kein direkten Zugriff mehr auf seine Mails, aber seine Mailbox existiert weiterhin und stellt den gesamten Funktionsumfang bereit. Hat der Mitarbeiter vor seinem Ausscheiden eine Weiterleitung an eine externe Mailadresse eingerichtet, so erhält er nach dem Ausscheiden auch weiterhin jede interne Mail an seine externe Adresse.

Wie kann das vermieden werden?

Ich haben seit einiger Zeit ein Script im Einsatz, welches alle Mailboxen trennt, dessen Mitarbeiter ausgeschieden sind. Aus der Unternehmenssoftware (z.B. SAP) heraus wird der Account des Mitarbeiters deaktiviert wenn dessen Vertragsverhältnis endet. An jeden 1. des Monats läuft das Script durch und überprüft alle Accounts nach diesen deaktivierten Mitarbeitern. Dazu ist in der Abfrage von "get-qaduser" die zu durchsuchende OU vorgegeben und es werden alle Resource Mailbox (Räume und Geräte) heraus gefiltert. Dieser Filter kann mit der Variable $filter in Zeile 36 beliebig angepasst werden. Bei den zurückgegebenen Accounts wird dann noch geprüft, welcher Account eine Mailbox hat. Dazu habe ich den Wert im Feld "SamAccountName" verwendet und an "get-user" übergeben. Das Ergebnis wird dann dazu verwendet, um mit "disable-mailbox" die Mailbox zu trennen.

Systemvoraussetzungen

Für den Einsatz dieses Scriptes ist die PowerShell und das entsprechende Exchange Management PowerShell Snapin der Serverversion von Nöten. Darüber hinaus wird die Quest ActiveRoles Management Shell for Active Directory 1.3 oder höher benötigt. Dieses Snapin ist noch aus älteren Zeiten, als es noch kein Active Directory Support für die PowerShell von Microsoft gab. Wer eine Domain auf Windows Server 2008 R2 betreibt kann auch das Active Directory Snapin von Microsoft verwenden. Und nicht vergessen, es müssen auch die entsprechenden Rechte vorhanden sein, um eine Mailbox trennen zu können.

Das Script sieht dann so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
##############################################################
#                                                            #
# Script to disable all Mailboxes of disabled Useraccounts   #
#                                                            #
# Nico Wieczorek 02.02.2009                                  #
#                                                            #
##############################################################
 
#First, findout if Exchange Management Shell is loaded:
 
$snapins = Get-PSSnapin |select name
$snapincount = 0;
$found = $false
 
do
{
 $founDName = $snapins[$snapincount].name
 switch ($founDName) {
 "Microsoft.Exchange.Management.PowerShell.Admin" {$found = $True; break}
 "Quest.ActiveRoles.ADManagement" {$found = $True; break}
 #Exchange Shell already loaded
 }
 $snapincount ++ }
while ($snapincount -lt $snapins.Count)
 
$date = ( get-date ).ToString('dd-MM-yyyy')
$file = New-Item -type file "E:\Exchange\Scripts\output\$date-DisabledMailbox.csv" -force
 
if ($found -ne $True)
{
 Add-PSSnapin "Microsoft.Exchange.Management.PowerShell.Admin"
 Add-PSSnapin "Quest.ActiveRoles.ADManagement"
}
 
$AllUsers = @()
$filter = "(!(|(mailnickname=confroom*)(mailnickname=car*)(mailnickname=handy*)(mailnickname=beamer*)))"
$ou = "berlin.testing.local/Accounts"
 
foreach ($objItem in Get-QADUser -Disabled -SearchRoot $ou -LdapFilter $filter)
{
  foreach ($User in Get-User -Identity $objItem.SamAccountName -OrganizationalUnit $ou | where {$_.RecipientType -eq "UserMailbox"})
  {
    $Datenbank = Get-Mailbox -Identity $User.Name
    Disable-Mailbox -Identity $User.DistinguishedName -confirm:$false
    $ReturnedObj = New-Object PSObject
    $ReturnedObj | Add-Member NoteProperty -Name "Nutzer" -Value $User
    $ReturnedObj | Add-Member NoteProperty -Name "Datenbank" -Value $Datenbank.Database
    $ReturnedObj | Add-Member NoteProperty -Name "Ablaufdatum" -Value $objItem.AccountExpires
    $AllUsers += $ReturnedObj
  }
}
 
$AllUsers
 
function sendmail([string] $body)
{
  $SmtpClient = new-object system.net.mail.smtpClient
  $MailMessage = New-Object system.net.mail.mailmessage
  $SmtpClient.Host = "mail.testing.local"
  $mailmessage.from = "exchange@testing.local"
  $mailmessage.To.add("support@testing.local")
  $mailmessage.Subject = "Disabled Mailbox Report"
  $mailmessage.Body = $body
  $MailMessage.IsBodyHtml = $TRUE
  $smtpclient.Send($mailmessage)
}
 
$AllUsers |export-csv $file -NoTypeInformation
$body = "Disabled Mailbox report for $date
<br><br><br>
folgende Mailboxen wurden deaktiviert:
"
$bodydetail = $AllUsers |sort-object "Nutzer" |convertto-html
$body = $body + $bodydetail
sendmail $body
9Mar/102

alle Mailboxen weg, was tun?

Man stelle sich vor, von einer Minute zur anderen sind alle Postfächer nicht mehr vorhanden. Das klingt nach dem Supergau, aber es muss nicht immer so schlimm sein, wie es auf den ersten Blick aussieht.

Es kann sein, dass durch ein Bedienfehler oder falsches Skript alle Mailboxen deaktiviert oder getrennt werden, aber in der Datenbank noch vorhanden sind. Leider sind in größeren Umgebungen die Mailboxen anfangs (noch) nicht als deaktiviert sichtbar und man fängt an zu glauben, dass die Mailboxen ganz verloren sind. Das ist bei Exchange aber relativ unwarscheinlich, viel realistischer ist die Warscheinlichkeit, dass die Datenbanktransaktion noch nicht vollständig gelaufen ist. Dabei kann es vorkommen, dass nicht alle Mailboxen als getrennt (disconnect) gekennzeichnet werden. Dies kann mittels dem Cmdlet 'Clean-MailboxDatabase' erzwungen werden. Danach sind alle getrennten Mailboxen in der Datenbank auffindbar und man kann sie wieder verbinden.

Sollten durch irgend einen Fehler alle Mailboxen getrennt  werden, so kann man mit folgenden Befehlen den Feierabend retten:

Get-MailboxDatabase | Clean-MailboxDatabase
$getback = Get-MailboxStatistics -Server <ServerName> | where { $_.DisconnectDate -ne $null }
Enable-Mailbox -Identity $getback.DisplayName -Database $getback.Database