Archive for the ‘Active Directory’ Category

Einen Linked Server hinzufügen: EXEC sp_addlinkedserver ‘ADSI’, ‘Active Directory Services 2.5′, ‘ADSDSOObject’, ‘adsdatasource’

Das SQL Statement sieht dann so aus:

SELECT [Name], SN [Last Name], ST State
FROM OPENQUERY( ADSI,

‘SELECT Name, SN, ST FROM ”LDAP://Domaincontroller/DC=YourDomain,DC=local”

WHERE objectCategory = ”Person” AND objectClass = ”user”’)

Nachdem ich nun Stunden damit verbracht habe, die sidHistory Filterung auszuschalten obwohl sie “angeblich” aus ist, bin ich nun auf die Lösung gestoßen:

bei den Parametern /enableSIDHistory und /quarantine gibt man üblicherweise NO an (weil ja alles in Englisch ist). Wenn es aber ein deutsches Betriebssystem ist, dann muss man hier aber NEIN angeben, dann klappt’s sofort.

Da kommt doch kein Mensch drauf….. :-(

Works with Windows Server 2008 now!
NRM hat den Plattformtest für Windows Server 2008 bestanden. (Windows Server 2008 und Managed Code)

Mehr Infos gibts hier!

Matthias

Der UPM (User Printer Manager) wurde upgedated und heißt nun NRM (Network Ressource Manager). (Hier der UPM Artikel)

Weitere Infos zu den Tools gibt es hier: DynaTools

Bisher konnte der UPM Drucker dezentral managen und Druckerzuweisungen im Active Directory vornehmen. Dabei kann man die Drucker sowohl den Benutzern, als auch den Computern und auf OU Ebene zuweisen.

Der NRM kann das auch und zusätzlich noch Laufwerkmapping vornehmen. Dies kann wiederum auf User-, Computer-, oder OU Ebene erfolgen. Jede Zuweisung kann durch Bedingungen (Gruppenmitgliedschaften) noch granular gesteuert werden. Dabei können die Bedingungen auf “muss Mitglied sein” oder “darf nicht Mitglied sein” konfiguriert werden.

Nettes Feature: Ich kann einen Friendly Name angeben, so dass der Benutzer nicht den UNC-Pfad am Laufwerk sieht, sondern einen für ihn verständlichen Namen. Beispiel: M:\(Sharename auf Server) wird dann als M: (Meine Daten) angezeigt.

NRM-User

NRM-AddUserDefinedMappings

Weil ich es immer wieder googeln muss, hier endlich mal die Links:

How to Install Exchange 2007 SP1 Prerequisites on Windows Server 2008 or Windows Vista
http://technet.microsoft.com/en-us/library/bb691354.aspx

How to Create a Windows Server 2008 Failover Cluster for Cluster Continuous Replication
http://technet.microsoft.com/en-us/library/bb676403.aspx

The installation of the Exchange Server 2007 Hub Transport role is unsuccessful on a Windows Server 2008-based computer
http://support.microsoft.com/kb/952842/en-us

(watch the “Fix it for me” :-) )

Zur Info:

Exchange als Proxy verwenden
GC referral ausschalten:

You can disable referrals altogether and force smart clients to use proxying. To do so, add the No RFR Service REG_DWORD value to the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeSA\Parameters registry subkey on the Exchange 2000 server and set the value to 0×1.

Ansonsten werden die smart Clients (Outlook 2000 und höher) durch den Exchange mit einer Liste an verfügbaren GCs versorgt. Der Client benötigt dann direkten Zugriff auf den Domaincontroller (Firewall Ports beachten!). Wenn das nicht klappt, versucht es Outlook so lange bei allen GCs, anschließend macht es dann doch der Exchange direkt. Das kann u.U. jedoch schon einige Nerven kosten.Matthias

Mit DS Proxy Service:   

Mit DSProxy

 

  

ohne DS Proxy Service (RegKey):

Ohne DSProxy

 

  

Mehr Infos gibt es unter diesem Link.         

 

Mit SP1 wird die GPMC die im RC0 enthalten ist automatisch entfernt. Aus Sicherheitsgründen, damit nicht jeder “User” die Konsole starten kann, und dann Settings ansehen kann. (lt. Microsoft).

Damit es unter Vista SP1 wieder funktioniert, muss man die Microsoft Remote Server Administration Tools for Windows Vista (KB 941314) herunterladen.

Anschließen nicht vergessen, unter Systemsteuerung/Programme und Funktionen die Tools auch zu aktivieren. Dazu in den Konfigurationsteil gehen: “Windows Funktionen ein- und ausschalten”. Dort die/das Häckchen für die Tools setzen, je nach dem welche man verwenden möchte!

Dann unter “Alle Programme/Verwaltung” das Tool starten.

Matze

 

Alle behaupten, die ACCTINFO.DLL funktioniert nicht unter Windows Server 2003 x64 bit!

Ich glaube, das geht schon. Zumindest habe ich den Tab in der DSA.MSC und ich sehe auch alle Infos.

So gehts:

regsvr32.exe accntinfo.dll (erst aus dem Resource Kit holen und z.B. unter %WINDIR%\system32 speichern.
Shortcut auf dem Desktop anlegen mit folgendem Link: (Beispiel)

C:\Windows\SysWOW64\mmc.exe C:\Windows\System32\dsa.msc -32

Den Shortcut ausführen, schon taucht der Tab auf. Witzigerweise taucht er ab dann immer auf, auch ohne -32.

Probierts aus.

Eine einfache und schnelle Methode, einen Gesamtüberblick über alle Global Catalog Server in einem Forest zu erhalten. Continue reading ‘Global Catalog Server mit VBScript finden (Find GC’s)’ »

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. Continue reading ‘Active Directory FSMO Roles per Script ermitteln’ »

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

 

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)
 

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!

Neue Computer werden per Default in den Container CN=Computers aufgenommen. Dumm nur, dass hier keine Policy gesetzt werden kann, das geht nämlich nur auf Organisationseinheiten. Der Admin hat dann zus. noch den Computer in die gewünschte Ziel OU zu verschieben.

Oder:

Redircmp.exe “DN-Pfad der OU”

Leitet den Ordner quasi um. Damit kann man eine Organisationseinheit festlegen, wo die neuen Computer immer landen.

Beispiel:

Redircmp.exe OU=Clients,OU=Computer,DC=Meine-Domain,DC=int

Für User gibt’s das auch, was dafür der Grund ist weiß ich aber nicht. Ich lege Benutzer sowieso immer manuell an, dann muss ich auch die OU auswählen. Für User heißt der Befehl übrigens RedirUsr.exe.

Hier der Link zum MS-Artikel: http://support.microsoft.com/kb/324949/en-us

Das ganze funktioniert erst in Windows 2003 Domänen.

 

 

Diese kleine Herausforderung kommt von einem Kunden, der den Local Admin Manager einsetzt. LAM v3.2 steuert zentral die Mitgliedschaft in der lokalen Admingruppe am Client. D.h. ein Benutzer kann gezielt an nur einem PC als lokaler Administrator eingetragen werden. So weit recht praktisch. Der Kunde setzt zwei Policies ein, eine für lokale Administratoren, eine für normale Benutzer (ohne Adminrechte). Dementsprechend soll der Desktop angepasst sein. Folglich kommt der Benutzer in die Sicherheitsgruppe für die Admin-Policy. Die “normale” Policy wird im verweigert, ebenfalls über eine Sicherheitsgruppe.

Nun kann der Benutzer, der z.B. am PC100 lokaler Admin ist, sich aber auch an PCs anmelden, an denen er nicht lokaler Administrator ist und erhält trotzdem seine Group Policy als Administrator. Er hat zwar keine Rechte an dem PC, dennoch sind die ein oder anderen Optionen für Admins freigeschalten, so dass er diese auswählen könnte.

Die Herausforderung ist, dass der Benutzer NUR an dem PC die Group Policy als lokaler Admin bekommt, wo er auch in der lokalen Gruppe “Administratoren” eingetragen ist. An allen anderen PCs soll die normale Group Policy ziehen.

Zur Info: Group Policies werden auf OU Ebene gesetzt und ziehen für den Benutzer/Computer innerhalb dieser OU-Struktur. Als weitere Einschränkung ist es noch möglich, die Zuweisung der Policy durch Gruppenmitgliedschaften zu “filtern”. D.h. nur Mitglieder in einer bestimmten Sicherheitsgruppe können die Policy anwenden.

Über WMI Filter können noch weitere Zuweisungsoptionen gesetzt werden. Dazu muss man sich in WMI jedoch ein bischen auskennen :-)

In mehreren verschiedenen Versuchen habe ich feststellen dürfen, dass es mit lokalen Gruppen nicht funktioniert. WMI Filter waren kaum zu erstellen, da ja das Ergebnis eines Filters nur TRUE oder FALSE zurückliefern darf. Der WMI Abfragestring darf auch nicht sehr umfassend sein, sonst kann WMI damit nicht umgehen. UND (die größte Hürde!): Ich kann auch lokaler Admin sein, ohne direkt in der Admingruppe Mitglied zu sein…..

Eine Lösung muss es aber geben!

Nachdem ich mich nach langer Pause mit diesem Thema wiedermal beschäftigt habe, bin ich auf folgende Lösung gestoßen:

  1. es kann nur mit dem WMI Filter gehen, lokale Sicherheitsgruppen ziehen nicht. (können nicht mal eingegeben werden), etwas anderes “lokales” kann ich nicht auswerten
  2. Welcher WMI Filter macht Sinn? Am Besten eine einfache Abfrage, die TRUE oder FALSE zurückliefert.
  3. Ich habe ein Logonscript, welches einen Wert in die Registry schreibt. Das geht aber nur, wenn ich lokaler Admin bin!
  4. Die Reihenfolge der Policies muss berücksichtigt werden.

Daraus ist erst mal dieses Script entstanden: Continue reading ‘Group Policy anhand lokaler Admingruppenmitgliedschaft zuweisen’ »

Per Default wird bei MS Exchange 2003 die Mailadresse anhand des Alias generiert und in das Benutzerobjekt geschrieben.

Damit aus dem Vornamen und Nachnamen die Mailadresse gestampt wird, muss dies bei der Recipient Policy eingetragen werden.

< %g>.< %s>@adresse.com

Siehe auch Beitrag vom createDialog im Active Directory

 

User Printer Manager mappt beim Anmelden an den PC die zugewiesenen/definierten Drucker. Die Drucker können an folgende Objekte zugewiesen werden:

  1. Benutzer
  2. Computer
  3. Organisationseinheit

Wer also an einen Computer einen Drucker binden möchte, weil dort z.B. die Ausgangslieferscheine gedruckt werden, der definiert den Drucker an das Computerobjekt. Egal wer sich dann dort anmeldet, er bekommt immer den Drucker zugewiesen.

Am Benutzer Drucker zu definieren erklärt sich ja von selbst. Das bedeutet, der Benutzer bekommt immer die definierten Drucker gemappt, egal wo er sich anmeldet.

Das Zuweisen auf OU Ebene ist eine Besonderheit und kann für “allgemeine” Druckermappings verwendet werden. Wer z.B. eine geografische OU Struktur einsetzt, kann für Räume, Etagen oder Gebäude spezielle Drucker definieren, die immer gemappt werden sollen. Dto. auch für organistorische OU Strukturen (Abteilungen, Bereiche usw.)

Jeder Benutzer kann sich natürlich auch noch selbst Drucker hinzufügen (Es soll ja Benutzer geben, die das können ;-) !) Der Administrator hat jedoch die Möglichkeit, dass bereits gemappte Drucker vor dem Zuweisen der definierten Drucker entfernt werden. So kann der Admin sicherstellen, dass keine “verwaisten” Drucker am Benutzer zurückbleiben und dadurch Performanceprobleme bei Applikationen (Word) hervorrufen. (Wysiwyg benötigt ja vorher die Druckerdefinition, wie es ausgedruckt werden könnte. Wenn der Drucker aber gar nicht mehr existiert, dann versucht Word so lange auf den Drucker zuzugreifen, bis ein Time Out eintritt.)

Wenn die auf OU Ebene zugewiesenen Drucker nicht verwendet werden sollen/können, dann gibt es noch die Möglichkeit, die Vererbung der zugewiesenen Drucker zu unterbrechen und für das Objekt neue Drucker festzulegen.

Bis hierher nix neues.

Ab sofort sind folgende Features zus. verfügbar:

  1. Individuelle Default Drucker Einstellungen für den jeweiligen Benutzer vorgeben (damit sind nicht die Default Printing Preferences durch den Druckertreiber gemeint!)
  2. Eigenschaften des Druckers können direkt aufgerufen werden (Kein Wechsel der Adminkonsolen nötig)
  3. Druckerwarteschlange öffnen
  4. Druckserver Eigenschaften direkt aus der Konsole anzeigen

Damit soll die Druckeradministration noch mehr in den UPM integriert werden, ohne jedesmal die Konsolen zu wechseln.

upm-contextmenu.JPG

 

 

Wo stehen die Benutzerdefinierten Druckeinstellungen?

HKCU\Printers\Connections\Druckername oder HKCU\Printers\DevModes2

 

Mapping der Drucker am PC und welche Auswirkungen hat das Ganze

Beispiel: Der Benutzer Hans, Matthias meldet sich am PC an.

Ein Logonscript, welches über eine Group Policy auf die OU (oder Domäne) gemappt wurde, läuft ab und ermittelt erst mal, welcher User sich an welchem Computer anmeldet. Dann wird noch geprüft, welcher Default Drucker eingestellt ist.

Wenn das Flag “vor Zuweisung löschen” gesetzt ist, dann werden jetzt alle Netzwerkdrucker gelöscht. Lokale Drucker bleiben erhalten!

Anschließend werden die definierten Drucker vom Computer, OU und dann noch vom User ausgelesen und zugewiesen.

Wenn der Benutzer an diesem Computer noch nie angemeldet war, dann hatte er an diesem PC auch noch nie einen Default Drucker. Durch das Häckchen am entsprechenden Drucker (in der UPM Managementkonsole) wird ihm der Defaultdrucker vorgegeben.

Sollte der User schon einen Defaultdrucker (oder sagen wir “Lieblingsdrucker”) ausgewählt haben, wird am Ende des Logonscriptes ihm dieser wieder als Defaultdrucker eingestellt. Die Häckchen in der Managementkonsole haben dann keine Bedeutung mehr.

Sollte durch den Administrator noch die Druckereinstellung vorgegeben worden sein, dann wird diese jetzt auch noch eingetragen.

(Druckereinstellungen für den Benutzer sind z.B. Zuführungsschacht, Ausgabeschacht Papierart/typ die von den Standards abweichen sollen.)

MH

 

Eigentlich ist das Globale Adressbuch von Outlook genau der Inhalt aller Mailbenutzer aus dem Active Directory. Ich hatte allerdings einen Kunden, der VoIP verwendet, und die Rufnummern aus dem globalen Adressbuch verwenden wollte. Da die TAPI Schnittstelle das aber nicht unterstützt (im globalen Adressbuch sind es keine IPM.Contact Elemente), sollten die ADS User in einen öffentlichen Ordner importiert werden. Dort sind die Kontakte dann IPM.Contact Elemente, mit denen konnte VoIP wieder was anfangen.

Über den Sinn/Unsinn läßt sich natürlich wieder diskutieren (haben wir auch :-) ). Der Sinn solcher Kundenwünsche muss sich mir ja nicht immer erschließen, es reicht ja, wenn der Kunde weiß was er damit machen will. Außerdem war es mal eine neue Herausforderung, das ganze via Script zu machen. Continue reading ‘Active Directory Benutzer in einen Exchange öffentlichen Ordner importieren’ »

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.

 

Hier ein Beispiel, wie die SID eines Benutzers einer Domäne ermittelt werden kann. Die Übergabeparameter an die Funktion GetSidByName müssen selbstverständlich an die Gegebenheiten angepasst werden. Continue reading ‘SID eines Domain Users via Script ermitteln’ »