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.

 

 

Exchange 2003 Enterprise Manager unter Windows 2003 x64 Version

Seit dem Windows 2003 x64 SP2 kann der Exchange 2003 Enterprise Manager (ESM) nicht mehr installiert werden. Es kommt sofort eine Fehlermeldung und man kann das Setup nur noch beenden (AHUI.EXE blockt das Setup).

Vor SP2 ging das aber! Deshalb habe ich einen Windows 2003 SP1 x64 installiert und dann die ESM Konsole installiert. Bei dieser Variante kommt zwar eine Warnung, dass es „inkompatibilitäten“ gibt, aber man kann wenigstens das Setup durchlaufen lassen. Anschließend auf SP2 updaten.

Wichtig: Natürlich kann der Exchange Server selbst nicht unter Windows 2003 x64 laufen (wg. z.B. IFS und anderen Diensten), aber ich wollte ja auch nur die Managementkonsole haben!

Zus. ist es nötig, dass das ADMINPAK.MSI aus dem Verzeichnis %WINDIR%\SysWOW64 installiert wird. Sonst tauchen nämlich die ADUC Erweiterungen für die Exchangeinformationen nicht auf 😉 !

Achtung: Microsoft supported die Installation des Exchangeservers unter Windows 2003 x64 nicht, auch nicht die Managementkonsole! Anwendung deshalb auf eigene Gefahr.

Update am 05.09.07:

Ich verwende CDO zum Erstellen von Mailboxen. Mein Script lief bisher immer mit „wscript.exe“. Die wscript.exe aus dem Verzeichnis %WINDIR%\System32 funktioniert aber nicht mehr. Man muss explizit den Pfad zur %WINDIR%\SysWOW64 angeben.

In der %PFAD% Variable steht der System32-Pfad zu erst, dann der SysWOW64. Nachdem es im System32-Ordner auch eine WScript.exe gibt, wird diese zuerst gezogen.  

Also, entweder den Pfad ändern, die WScript.exe von Syswow64 nach System32 kopieren oder mit absoluten Pfaden arbeiten.

Matze

Active Directory FSMO Roles per Script ermitteln

Da unter Windows 2003 x64 der Replmon nicht mehr dabei ist, habe ich mir notgedrungen endlich ein Script geschrieben, welches mir schnell eine Übersicht liefert, welche Server gerade welche FSMO Rolle beheimaten.

Im Script muss der Domaincontroller DNS-Servername eingetragen werden. „Active Directory FSMO Roles per Script ermitteln“ weiterlesen

Group Policy Management Konsole unter Windows 2003 x64 installieren

Die GPMC kann per Default nicht unter Windows 2003 x64 installiert werden. Das liegt aber nicht daran, dass es technisch nicht möglich wäre und Fehler produziert werden, sondern daran, dass die Setuproutine auf .Net Framework 1.1 prüft und bei nicht Vorhandensein behauptet, man solle erst das Framework SP1 installieren.

Wer das nicht möchte (bei Windows 2003 x64 wird .Net Framework 2.0 installiert), der kann sich auch die gpmc.msi anpassen. Dazu benötigt man jedoch das orca.exe Programm. (Ich hab’s! Ansonsten viel Spaß beim Suchen 🙂 )

Das MSI anpassen und den Eintrag BlockOnNoNetFramework löschen.

Nach der Installation unter x64 muss dann zus. folgendes angepasst werden:

gpmc.msc vom Ordner \Windows\SysWOW64 nach \Windows\System32 kopieren (die fehlt hier nämlich)
gpedit.msc vom Ordner \Windows\System32 nach \Windows\SysWOW64 kopieren

Schon funktioniert es auch unter Windows 2003 x64

 

Matze

 

 

Reparieren von fehlenden VSS Writern (Erfahrung aus Windows 2003 x64)

Wenn NTBackup beim Beginn der Sicherung an der Volume Shadow Copy Vorbereitung hängen bleibt und dann einen Time-Out bringt, liegt es daran, dass keine VSS Writers vorhanden sind, oder diese, aus welchen Gründen auch immer, fehlerhaft registriert sind.

Folgende Lösung hat bei mir bisher immer geholfen:

1.) Den Key HKLM\Software\Microsoft\EventSystem\{26c409cc-ae86-11d1-b616-00805fc79216}\Subscriptions (Achtung, nur diesen) löschen
2.) Server rebooten
3.) vssadmin list writers ausführen

Jetzt muss eine Liste der VSS Writer aufgeführt werden. Wenn nicht, dann ist immer noch ein Bug drinnen.

Dann kann u.U. folgendes zus. helfen:

Net stop vss
Net stop swprv
regsvr32.exe /i %windir%\system32\eventcls.dll
regsvr32.exe /i %windir%\system32\swprv.dll
regsvr32.exe %windir%\system32\vssui.dll
regsvr32.exe %windir%\system32\vss_ps.dll
regsvr32.exe %windir%\system32\msxml.dll
regsvr32.exe %windir%\system32\msxml2.dll
regsvr32.exe %windir%\system32\msxml3.dll
regsvr32.exe %windir%\system32\msxml4.dll
regsvr32.exe %windir%\system32\ole32.dll
regsvr32.exe %windir%\system32\oleaut32.dll
regsvr32.exe %windir%\system32\es.dll
regsvr32.exe %windir%\system32\comsvcs.dll
vssvc /register
net start swprv
net start vss

Und zu Guter letzt sollte in dem RegKey

HKEY_CLASSES_ROOT\CLSID\{FAF53CC4-BD73-4E36-83F1-2B23F46E513E}\InProcServer32

im Default der Pfad %systemroot%\system32\ES.DLL eingetragen sein.

Matze

 

LAM v4.0 Local Admin Manager

In den letzten Wochen war ich natürlich nicht untätig. Ich habe unseren LAM v3.x auf die neue Version v4.0 gebracht.

Die Software wurde komplett in VB2005.NET geschrieben und basiert auf dem .Net 2.0 Framework. Einige Funktionen wurden endlich überarbeitet und dem neuen Look&Feel angepasst. Somit ist der LAM für Windows Server 2008 gut gerüstet.

Screenshot:

LAMv4.0 Administration an der Workstation LAM v4.0 Search

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)
 

Über ADSystemInfo den Benutzer DN ermitteln

So kann man relativ leicht auf Benutzerinfos des angemeldeten Benutzers zugreifen:

Set oRootDSE = GetObject(ldap://RootDSE/)
Set oADSystemInfo = CreateObject(”ADSystemInfo”)
Set oUser = GetObject(”LDAP://” & oADSystemInfo.UserName)

bzw. noch mehr Infos:

Set objADSysInf = CreateObject(„ADSystemInfo“)
WScript.Echo objADSysInf.UserName
WScript.Echo objADSysInf.ComputerName
WScript.Echo objADSysInf.DomainDNSName
WScript.Echo objADSysInf.DomainShortName
WScript.Echo objADSysInf.SiteName
WScript.Echo objADSysInf.PDCRoleOwner
WScript.Echo objADSysInf.IsNativeMode

strSrv = objADSysInf.GetAnyDCName
WScript.Echo strSrv
WScript.Echo objADSysInf.GetDCSiteName(strSrv)
WScript.Echo Join(objADSysInf.GetTrees, „; „)

Damit kann man dann sofort auf das User-Objekt zugreifen, ohne erst lange anhand des Anmeldenames im ADS den Benutzer zu suchen.

In VB.Net folgende Deklaration verwenden(IADsADSystemInfo):

Dim adSys as New ADSystemInfo

Wie immer: Vorher lesen, dann ausprobieren!

Einen deaktivierten Benutzer wieder aktivieren (oder anders herum)

Ein deaktivierter Benutzer kann im ADS sehr einfach scriptgesteuert aktiviert werden. Es geht auch anders herum; so dass ein Benutzer via Script einfach deaktiviert wird. Es gibt mehrere Provider mit denen man das durchführen kann, da ich aber quick and dirty jetzt diese Funktion brauche, habe ich mich für den WinNT Provider entschieden. Da muss ich nur den samAccountNamen haben, schon kann ich loslegen. Wenn es über LDAP gemacht werden soll, dann muss ich den kompletten Distinguished Namen des Objektes kennen. Das ist mir jetzt aber zu viel Aufwand, das jedesmal zu ermitteln.

Über Parameter kann man das Script ganz einfach erweitern. z.B. kann über eine Inputbox der samAccountName abgefragt werden.

Set objUser = GetObject(„WinNT://NETBIOSDOMÄNE/aetest“)

objUser.AccountDisabled = False
objUser.SetInfo

Msgbox „Account wurde aktiviert!“,vbokonly+vbinformation,“Enable Account“
 

 

Bei Scripten gilt immer: Erst den Quellcode lesen, dann ausprobieren.

 

CommonDialog mit VB Script verwenden

Mit VB Script kann auch auf das CommonDialog Objekt von Windows zugegriffen werden. Es stehen nicht alle Methoden zur Verfügung, aber zum Auswählen von Dateien reicht es allemal!

Mit VB Script kann auch auf das CommonDialog Objekt von Windows zugegriffen werden. Es stehen nicht alle Methoden zur Verfügung, aber zum Auswählen von Dateien reicht es allemal! „CommonDialog mit VB Script verwenden“ weiterlesen

extraColumns in der ADS MMC

Die Spalten, die in der ADS MMC angezeigt werden, können seit Windows 2003 ADS durch eigene Spalten ergänzt werden. Es können (fast) alle Attribute von allen Objekten hinzugefügt werden. Das macht natürlich nur Sinn, wenn die Werte auch brauchbare Inhalte haben. Ich verwende typischerweise eigene Attribute, die mit Werten beim Starten des Computers oder beim Anmelden eines Benutzers durch Scripte geschrieben werden.

Kleines Beispiel: Ein Kunde wollte die MAC Adresse der primären Netzwerkkarte dort stehen haben, um WOL zu verwenden. Es kann aber auch einfach nur die Betriebssystemversion/bezeichnung hinzugefügt werden. Hier die Kurzversion, wie’s geht: (Erfahrung im ADS wird vorausgesetzt! Wenn nicht, lass‘ einfach die Finger davon, sonst kannst Du mehr kaputt machen, als dir lieb ist!)

The Add/Remove Columns dialog box displays only the columns that are contained in the extraColumns attribute of the displaySpecifier object of the container type that is being displayed. If the extraColumns attribute does not contain any values, the Add/Remove Columns dialog box will display a fixed set of columns. A copy of the fixed set of columns is contained in the extraColumns attribute of the default-Display object.   To add one or more columns to the list of columns for a specific object, you must copy all of the extraColumns values from the default-Display object to the target object and then add the custom columns. If you specify the extraColumns attribute on a given class, then that class will use those columns and will not merge them with the columns that are specified in the default-Display class. Therefore, further changes to the default-Display class will have no effect on that object. To display a custom column for all container types that do not have any custom columns registered, add a value for the column to the extraColumns attribute of the default-Display object.

Am Beispiel:

For example, to add a column that will display the canonical name for objects in an organizational unit, a value for the canonicalName attribute is added to the extraColumns attribute of the organizationalUnit-Display object in the display specifiers container. The string added to the extraColumns attribute of the organizationalUnit-Display object will look like the following.
 
  canonicalName,Canonical Name,0,150,0

Aufbau des Attributes extraColums im Allgemeinen:

     Ldapdisplayname , column header , default visibility , width , unused