Exchange 2010 Out of Office / MailboxAutoReplyConfiguration

In Exchange 2010 gibt es nun die Möglichkeit, den Abwesenheitsassistenten (OOF Out of Office) zentral zu steuern. Das ist sehr hilfreich, wenn man sich nicht Vollzugriff auf das Benutzerpostfach aneigenen möchte – nur um den Abwesenheitsassistenten zu aktivieren.
Damit das auch durch den Helpdesk bedient werden kann, habe ich da mal eine GUI außen herum gebastelt….
Matthias

Exchange 2010 SP1 Mailbox Move Statistics

Das Attribut „BytesTransferredPerMinute“ ist nur während eines Moves/Export gefüllt. Nach erfolgreichen Move/Export ist das Attribute wieder leer. Eine Statistic über die Performance der bereits verschobenen Mailboxen würde mich aber schon interessieren um daraus Rückschlüsse für weitere Move/Export-Requests ziehen zu können.

Ich habe mir dazu ein Script geschrieben, welches den Wert berechnet (Es kann natürlich beliebig erweitert werden):

Function Get-MailboxMoveStatistics {

$Requests = Get-MoveRequest|get-MoveRequestStatistics 
foreach($Request in $Requests ) {

$MBXSize  = $Request.BytesTransferred
$Duration = $Request.OverallDuration        
#-> Bei Werten kleiner 1 MB ist das Ergebnis immer 0. Deshalb neuer Ansatz
#     $MBAvg = $MBXSize.ToMB() / $Duration.TotalMinutes          
$MBAvg = ($MBXSize.ToBytes() / $Duration.TotalMinutes) / 1MB

New-Object PSObject -Property @{

Alias = $Request.Alias
MBXSize = $Request.BytesTransferred
OverallDuration = $Request.OverallDuration
„MBTransferredPerMinute“ = „{0:n2}“ -f $MBAvg   

         
}

}

}

Exchange 2010 Datenbankstatistik und Datenbank Größe ermitteln

Damit können die Größen der Datenbanken ermittelt werden. Wenn ein vordefiniertes Limit erreicht ist, dann wird ein Eventlog geschrieben, dass eine weitere Datenbank nötig ist.

Function Get-DatabaseStatistics { 
     $Databases = Get-MailboxDatabase -Status
     $Result = „“

     foreach($Database in $Databases) { 
         $DBSize = $Database.DatabaseSize 
         $MBCount = (Get-Mailbox -Database $Database.Name).Count 
         $MBAvg = $DBSize.ToBytes() / $MBCount            

 $Result += „Server`t`t`t: “ + $Database.Server.Name+[char]13+[char]10
 $Result += „Databasename`t`t: “ + $Database.Name+[char]13+[char]10
 $Result += „MailboxCount`t`t: “ + $MBCount +[char]13+[char]10
 $Result += „DatabaseSize (GB)`t`t: “ + „{0:n2}“ -f ($DBSize.ToBytes() / 1GB)  +[char]13+[char]10
 $Result += „WhiteSpace (MB)`t`t: “ + „{0:n2}“ -f ($Database.AvailableNewMailboxSpace.ToBytes() / 1MB)  +[char]13+[char]10
 $Result += „AverageMailboxSize (MB)`t: “ + „{0:n2}“ -f ($MBAvg / 1MB)  +[char]13+[char]10
 $Result += „LastFullBackup`t`t: “ + $Database.LastFullBackup        +[char]13+[char]10

 $result +=  [char]13+[char]10

     } 
     return $Result

 } 
  
Function Get-DBSize($SITE){
 $Faktor        = 1GB      # Darstellung in MB oder GB….
 $MaxDBSize     = (100 * $Faktor)    # Maximale Größe der Datenbank in MB oder GB je nach Faktor, Default 100 xB….
 $HighWaterMark = ($MaxDBSize * 0.8 / $Faktor)   # Ab wann soll gewarnt werden (80% default)
 $DBCounter     = 0
 $lNewDB=$TRUE
 $Result = „“
 
 $MaxDBSize     = (100 * $Faktor)/$Faktor

 
 #Sucht nur ZDx Datenbanken
 ForEach($Database in Get-MailboxDatabase ZD* -Status|Sort-Object Name)
 { $DBCounter = $DBCounter +1
  $DBSize        = ($Database.DatabaseSize.ToBytes() / $Faktor)
  # Passt in diese Datenbank noch eine Mailbox rein?
  
  write-host $Database.Name
  write-host $DBSize
  write-host $HighWaterMark
  if ($DBSize -lt $HighWaterMark)
  {              
   $lNewDB = $False   
   # Wenn noch eine reinpasst, dann muss keine NewDB angelegt werden ($False)
   break     
   # Schleife kann nun schon beendet werden
  }
 }
 # das neue Postfach hat in keine DB reingepasst, also muss eine neue DB angelegt werden
 if ($lNewDB -eq $True) {
  $Help= „Alle {2} -Datenbanken sind zu mehr als {0} % belegt. Maximale Datenbankgröße {1:n2} MB. Neue {2} -Datenbank wird benötigt.“ -f $HighWaterMark, $MaxDBSize, $Site
#write-host $Help
write-eventlog -logname Application -source „MSExchangeStatistic“ -eventID 997 -entrytype Warning -message $help

 }
}
Function SendMail($MessageBody){

 $emailFrom = From@domain.de
 $emailTo = Empfaenger@domain.de
 $subject = „Database Statistics“
 $body = $MessageBody
 $smtpServer = „Mailserver.domain.de“
 $smtp = new-object Net.Mail.SmtpClient($smtpServer)
 $smtp.Send($emailFrom, $emailTo, $subject, $body)
}

########################################################################################################################

$result = Get-DatabaseStatistics
write-eventlog -logname Application -source „MSExchangeStatistic“ -eventID 998 -entrytype Information -message $result
SendMail($result)

Get-DBSize(„ZD“)
Get-DBSize(„VB“)

 exit

Exchange 2010 MailTipsExternal und Group Metrics

Get-OrganizationConfig |fl *tips*
MailTipsExternalRecipientsTipsEnabled : False
MailTipsLargeAudienceThreshold        : 25
MailTipsMailboxSourcedTipsEnabled     : True
MailTipsGroupMetricsEnabled           : True
MailTipsAllTipsEnabled                : True

Um die GroupMetrics wird benötigt, um die Anzahl der Mitglieder in einer Mailgruppe zu ermitteln. Um keine Online-Abfrage der Gruppenmitglieder machen zu müssen, wird jeden Tag um xx:xx Uhr die Liste der Gruppenmitglieder neu generiert. Dazu muss der MBX-Server konfiguriert werden:

Set-MailboxServer EXCH2010-SRV1 -GroupMetricsGenerationEnabled:$true

Der Dienst „Microsoft Exchange Service Host“ ist dafür verantwortlich. Er kopiert das Ergebnis auf den/die CAS Server in das Verzeichnis %ProgramFiles%\Miccrosoft\Exchange Server\V14\ClientAccess\GroupMetrics.

Wenn man einem User das Recht genommen hat, an einen Empfänger Mails zu senden, erscheint dies ebenfalls als MailTips Meldung.
(Set-Mailbox UaserA -RejectMessageFromSendersOrMembers UserB bedeutet, dass UserB keine Mails mehr an UserA senden darf.)

Zusätzlich kann man sich selbst auch Custom MailTips erstellen:

(mit Set-Mailbox und Set-DistributionGroup)

Set-Mailbox UserB –Mailtip “Sind Sie sicher, dass sie mir eine Mail senden müssen ? :-)”

Exchange 2007 Message Tracking

Mich nervt diese umständliche Eingabe an Informationen beim Message Tracking. Ich brauche eine Quick and Dirty Lösung, da zu 95% immer nach Sender, Empfänger und Betreff in einem Bestimmten Zeitraum gesucht wird. Die Angabe des Servers (Hub oder MBX) soll automatisch (immer) erfolgen.

Schnell mal eine Lösung mit Powershell gebastelt, somit leicht modifizierbar! (Suchen über mehrere Tage würde das Zeitfenster pro Tag auf die angegebenen Zeiten beschränken. Da muss ich mir noch was überlegen, wie der LogParser wirklich Date+Time erkennen kann.)

Hier gehts zum script…. „Exchange 2007 Message Tracking“ weiterlesen

Powershell Bastelstunde

$host.ui.PromptForCredential(„Melden Sie sich an“,“Ihr Password bitte:“,““,“NetBiosDomainName“)

oder

$yes = new-Object System.Management.Automation.Host.ChoiceDescription „&Yes“,“help“;
$no = new-Object System.Management.Automation.Host.ChoiceDescription „&No“,“help“;
$choices = [System.Management.Automation.Host.ChoiceDescription[]]($yes,$no);
$antwort=$Host.ui.PromptForChoice(„Bitte wählen Sie“,“Welchen Button drücken Sie?“,$chioces,0)

0 = yes
1 = no

 

Addressviews auf Exchange 2007 anpassen (Powershell)

Da ich bei einem Kunden mehr als 300 Adressviews anpassen sollte, habe ich mir dazu ein Powershell Script gebastelt. Damit geht’s schneller und einfacher.

Wer es verwenden möchte, muss seinen LDAP Pfad anpassen. Bitte vorher lesen, was das Script macht, dann ausprobieren!

$Searcher=New-Object System.DirectoryServices.DirectorySearcher
$Searcher.SearchRoot=“
LDAP://CN=All Address Lists,CN=Address Lists Container,CN=[Exchangeorg],CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=[YourDomain],DC=com“
$Searcher.SearchScope=1
$Searcher.Filter=“(&(objectClass=addressBookContainer)(!msExchQueryFilter=*))“
$Searcher.PageSize=1000
$Searcher.SizeLimit=1000

#
#   Suche alle betroffenen
#

$Result = $Searcher.FindAll()

#
# in schleife durchgehen, und alle Adressviews abarbeiten
#
foreach ($member in $Result) {

 #
 # views aus ADS referenzieren/holen
 # 
   $objADR = $Member.GetDirectoryEntry()
 
 #
 # Hilfsvariable
 #
   $Ident   = $objADR.cn

   Set-AddressList „$Ident“ -RecipientFilter „CustomAttribute15 -eq ‚DL-$Ident'“ -ForceUpgrade:$TRUE
   update-AddressList -Identity „$Ident“

}

 

 

 

Matthias

 

Upgrade auf Exchange 2007 ToDos

Adresslisten upgraden auf OPATH Syntax:

Set-AddressList „All Users“ -IncludedRecipients MailboxUsers
Set-AddressList „All Groups“ -IncludedRecipients MailGroups
Set-AddressList „All Contacts“ -IncludedRecipients MailContacts  

Set-GlobalAddressList „Default Global Address List“ -RecipientFilter {(Alias -ne $null -and (ObjectClass -eq ‚user‘ -or ObjectClass -eq ‚contact‘ -or ObjectClass -eq ‚msExchSystemMailbox‘ -or ObjectClass -eq ‚msExchDynamicDistributionList‘ -or ObjectClass -eq ‚group‘ -or ObjectClass -eq ‚publicFolder‘))}  

oder

oder

msExchQueryFilterMetadata: „Microsoft.Exchange12.8f91d340bc0c47e4b4058a479602f94c:RecipientFilterType=1“ (String)
msExchMinAdminVersion: „-2147453113“ (String)
msExchQueryFilter: „CustomAttribute15 -eq ‚[Your value]'“ (String)
purportedSearch: „(extensionAttribute15=[Your value])“ (String)
msExchRecipientFilterFlags: „1“ (String)
msExchLastAppliedRecipientFilter: „CustomAttribute15 -eq ‚[Your value]'“ (String)
msExchVersion: „4535486012416“ (String)

 

E-Mail Recipient Policy upgraden:

Set-EmailAddressPolicy PolicyName -RecipientFilter { ( DisplayName -like „IT*“ ) }

Full Mailbox Access auf Mailboxen setzen: Entweder über die Konsole, rechte Maustaste auf das Postfach, Manage Full Mailbox Access, oder über die Shell:

Add-MailboxPermission -Identity ‚CN=TeamMailbox1,CN=Users,DC=contoso,DC=com‘ -User ‚CONTOSO\donald.duck‘ -AccessRights ‚FullAccess‘ 

Matthias

 

 

Exchange 2007 User Mailbox zur Resource Mailbox konvertieren / AutoAccept

 

Set-Mailbox „MailboxName“ -Type Room

Und damit Besprechungsräume automatisch Besprechungsanfragen annehmen:

Set-MailboxCalendarSettings „MailboxName“ -AutomateProcessing AutoAccept

 

Eine Liste aller Resource Mailboxen:

Get-Mailbox | where {$_.IsResource -eq „true“}

 

Einige Parameter, die bei CalendarSettings angegeben werden können:

 

AddAdditionalResponse False  

Powershell Commands für Exchange Installation

Powershell:

  • Exchange 2007 Mailbox Size ermitteln:
    get-mailboxstatistics | fl displayname,totalitemsize
  • Log-Files einer SG verschieben:
    move-StorageGroupPath -Identity ‚CONTOSO\First Storage Group‘ -LogFolderPath ‚D:\Log‘ -SystemFolderPath ‚D:\System Logs‘
  • Datenbank einer SG verschieben:
    move-DatabasePath -Identity ‚CONTOSO\First Storage Group\Mailbox Database‘ -EdbFilePath ‚E:\First Storage Group\Mailbox Database.edb‘
  • Exchange Org-Admin hinzufügen:
    Add-ExchangeAdministrator -Identity ‚contoso.com/users/…./ExAdmin2‘ -Role ‚OrgAdmin‘
  • Internet Mail Connector (Send) hinzufügen:
    new-SendConnector -Name ‚Contoso-Internet‘ -Usage ‚Internet‘ -AddressSpaces ‚SMTP:*;1‘ -IsScopedConnector $false -DNSRoutingEnabled $true -UseExternalDNSServersEnabled $false -SourceTransportServer ‚EX001‘
  • Postmaster Hub-Transport anlegen:
    Set-TransportServer ‚Hub-Server-Name‘ -ExternalPostmasterAddress ‚Postmaster@contoso.com‘
  • Postmaster Organisationsweit anlegen:
    Set-OrganizationConfig -MicrosoftExchangeRecipientReplayRecipient ‚Postmaster@contoso.com‘
  • NDR-Error Code hinzufügen (seit SP1 besser über die GUI!):
    Set-TransportConfig -GenerateCopyOfDSNFor 5.4.8, 5.4.6, 5.7.1, 5.7.2 usw.

Update: 01.04.2008:

Address List and EAP filter upgrades with Exchange Server 2007

Wichtig: nach einem Upgrade die EMailAdressPolicy und Adresslisten updaten! Hier der Link zu einem guten Artikel: http://msexchangeteam.com/archive/2007/01/11/432158.aspx 

Ende.

 

 

Zugriffe auf Active Directory mit PowerShell

Auf Objekte im ADS kann wie folgt zugegriffen werden:

$MyObject = [ADSI]“LDAP://OU=Benutzer,DC=Domain,DC=int
$MyObject = New-Object System.DirectoryServices.DirectoryEntry
$MyObject.PSBase.Path = „
LDAP://OU=Benutzer,DC=Domain,DC=int

oder

$MyObject = New-Object System.DirectoryServices.DirectoryEntry(„LDAP://OU=Benutzer,DC=Domain,DC=int„)

Auf die Attribute kann so zugegriffen werden:

write-host $MyObject.PSBase.Name
write-host $MyObject.PSBase.InvokeGet(„name“)
write-host $MyObject.PSBase.Properties.name
write-host $MyObject.PSBase.Properties.Item(„name“)

Werte setzen mit:

$MyObject.PSBase.InvokeSet(„adminDescription“,“MeineAdminDescription“)
$MyObject.PSBase.CommitChanges()

Matze

 

Powershell Funktion mit [ref] Parameter aufrufen

Habe schon lange nichts mehr gepostet, liegt daran, dass ich zur Zeit nichts erwähnenswertes habe. Seit kurzem Beschäftige ich mich mit der Powershell. Anfangs eher skeptisch, bin ich nun totaler Freund der PS!

Ein wenig Erfahrung in Programmierung und .Net-Framework kann übrigens nicht schaden 🙂 

Eine Funktion kann mit „call by reference“ aufgerufen werden. Wichtig ist dabei, dass sowohl in der Funktion, als auch imAufruf der Parameter [ref] verwendet wird.

Funktionen werden einfach per Namen angegeben und deren Parameter übergeben.
Beispiele:
MyFunction($x,$y,$z)
MyFunction($x)($y)($z)
(ist identisch mit der vorherigen Variante)

Bei Verwendung von referenzierten Werten (auch wenn nur ein Ref-Wert dabei ist), müssen alle Aufrufparameter so angegeben werden:
MyFuntion([ref]$x)($y)($z)

Der Aufruf mit
MyFunction([ref]$x, $y, $z) geht nicht!!!!

Da würde dann folgender Fehler auftreten:
Reference type is expected in argument. MyFunction(< <<<<  )

Auf den Referenzierten Wert kann man innerhalb der Funktion nur über $Variable.Value zugreifen. Alles andere geht schief.

(Das funktioniert auch bei referenzierten Objekten.)

Beispiel:

FUNCTION ChangeValue([ref]$a) {
$a.Value=“Neuer Wert in Function“
}

Aufruf: 

$Input=“Grundwert“
changevalue([ref]$Input)
Write-host $Input

liefert „Neuer Wert in Function“

Übergabe mehrerer Parameter muss explizit angegeben werden. Das sieht dann in etwa so aus:

FUNCTION Swap([ref]$Var1, [ref] $var2) {
$var1.Value=“Neuer Wert Variable1″
$var2.Value=“Neuer Wert Variable2″
}

Aufruf erfolgt dann so:

Swap([ref]$In1)([ref]$In2)