-
Technisches
Gebiet
-
Diese
Erfindung betrifft Computer-basierte Verzeichnisdienste und ganz
besonders ein Verfahren und System zum gleichmäßigen Zugreifen auf die Verzeichnisdienste.
-
Hintergrund
der Erfindung
-
Computersysteme
speichern und unterhalten typischerweise eine große Menge
an Daten, die das Computersystem und seine Benutzer betreffen. Zum
Beispiel kann ein Computersystem Namen, E-Mail-Adressen und Telefonnummern
der Benutzer des Computersystems bewahren. Das Computersystem kann
auch Information bezüglich
der verschiedenen mit dem Computersystem verbundenen Drucker unterhalten.
Diese Information kann Druckermerkmale (z.B. Laser und Farbe) und
Namen von Benutzern enthalten, die berechtigt sind, jeden Drucker
zu benutzen. Mehrere verschiedene Arten von Computerprogrammen,
bekannt als "Clients", können Zugang
zu dieser Information benötigen.
Zum Beispiel kann ein Client ein Computerprogramm sein, das festzustellen
hat, welche Drucker benutzt werden können, um ein Dokument in Farbe zu
drucken. Ein anderer Client kann ein Computerprogramm sein, das
einem Systemverwalter erlaubt, die Information zu aktualisieren,
um z.B. Information bezüglich
eines neu hinzugefügten
Druckers widerzuspiegeln. Computersysteme haben traditionell solche
Information in einer Vielfalt von Stellen und Formaten gespeichert. Zum
Beispiel kann Information bezüglich
eines Druckers in einer Konfigurationsdatei gespeichert werden,
und Information bezüglich
eines Benutzers kann in einer Datenbank gespeichert werden. Typischerweise
war es daher für
einen Programmierer, der einen Client entwickelte, sehr schwer,
auch nur zu wissen, wo nach dieser Information zu suchen ist, geschweige
denn zu wissen, wie darauf zuzugreifen ist.
-
Einige
Computersysteme stellen einen Verzeichnisdienst bereit, um beim
Speichern und Unterhalten dieser Information zu helfen. Ein Verzeichnisdienst
stellt einen Speicher dieser Information bereit, auf den ein Client über das
Netzwerk zugreifen kann. Verzeichnisdienste verweisen gewöhnlich auf
die Dinge (z.B. Benutzer, Drucker oder Zugriffsgruppen), für die Information
unterhalten wird, als "Objekte". Verzeichnisdienste
gliedern solche Objekte hierarchisch in ein Verzeichnis. Das heißt, ein
Objekt, auf das als ein Behälterobjekt
verwiesen wird, kann verschiedene andere Objekte enthalten, auf
die als enthaltene Objekte verwiesen wird. Zum Beispiel ist eine
Zugriffsgruppe, die Benutzer umfasst, die sich in gemeinsame Zugriffsrechte
auf eine Ressource teilen, ein Behälterobjekt, das Benutzer enthält, die enthaltene
Objekte sind. Jedes Objekt, für
das ein Verzeichnisdienst Information untehält, hat einen eindeutigen Identifikator
(z.B. ein Name), mit dem ein Client das Objekt identifizieren kann.
Obwohl Verzeichnisdienste ursprünglich
entwickelt wurden, um Information bezüglich Computersystemen zu unterhalten,
können
sie benutzt werden, um Information ohne Bezug auf Computersysteme
zu unterhalten. Zum Beispiel kann ein Verzeichnisdienst von einem
Flugzeughersteller verwendet werden, um eine Teileliste für die Komponenten
und Unterkomponenten eines Flugzeugs zu unterhalten.
-
1 veranschaulicht eine Musterhierarchie
eines Verzeichnisdienstes. Jeder Block stellt ein Objekt einer bestimmten "Objektklasse" dar. Zum Beispiel,
ein Objekt, das eine Firma darstellt, würde eine Objektklasse mit Namen "Firma" haben. Jede Objektklasse
definiert die Merkmale von Objekten dieser Objektklasse. Zum Beispiel
kann die Objektklasse Firma die Merkmale "Name" und "Adresse" definieren. Jedes
Objekt hat einen Merkmalwert für
jedes für
die Objektklasse definierte Merkmal. Zum Beispiel kann ein Objekt
der Objektklasse Firma den Merkmalwert "MS" für das Namensmerkmal
haben. Block 101 entspricht einem Objekt der Objektklasse
Firma und hat einen Wert für
den Namen und Adressmerkmale. Block 102 entspricht einem
Objekt der Objektklasse Abteilung und hat einen Wert für den Namen
der Abteilung (z.B. "System"). Block 103 entspricht
einem Objekt der Objektklasse Benutzer und hat einen Wert für die E-Mail-Adresse
des Benutzers. Weil der Verzeichnisdienst hierarchisch gegliedert
ist, kann jedes Objekt durch einen Pfad von der Wurzel zu dem Objekt
eindeutig identifiziert werden. Zum Beispiel wird Objekt 102 durch
den Pfad "Firma=MS\Abtei-lung=System" eindeutig identifiziert.
Der Verzeichnisdienst stellt einen begrifflichen endlichen Raum,
bezeichnet als Namensraum, bereit, in dem ein gegebener Name aufgelöst werden
kann. Der Verzeichnisdienst löst
Pfade zu Objekten in dem Verzeichnis unzweideutig auf.
-
Verschiedene
Lieferanten stellen Verzeichnisdienstsysteme bereit. Jeder Lieferant
entwirft und implementiert typischerweise eine Anwendungsprogrammschnittstelle
(API), um Clients zu erlauben, auf sein Verzeichnisdienstsystem
zuzugreifen. Jedes Verzeichnisdienstsystem kann sehr verschiedene
API-Sätre
haben, was in der Regel der Fall ist. Wenn ein Client Verzeichnisdienstsysteme
benutzen muss, weil z.B. der Client in einer Umgebung arbeitet,
die Personal Computer und Mainframe Computer enthält, müsste der
Programmierer des Client über
die AIP-Sätre
jedes Verzeichnisdienstes Bescheid wissen und den Client entwerfen,
um jeden der API-Sätze
zu unterstützen.
-
Obwohl
jeder API-Satz tieferantenspezifisch ist, stellen API-Sätze im Allgemeinen ähnliche
Funktionalität
bereit. Die API-Sätze
enthalten gewöhlich
Funktionen zum Zugreifen auf Merk malwerte der Objekte und Funktionen
zum Definieren neuer Objektklassen. Die Funktionen zum Manipulieren
von Objekten sind z.B. OpenObject, ReadObject, WriteObject, ListObjects,
CloseObject, CreateObject und DeleteObject. Der Funktion OpenObject
wird die Identifikation (z.B. Pfad) zu einem Objekt übergeben,
und sie gibt eine Handhabe zurück,
die dieses Objekt identifiziert. Die Handhabe wird später von
dem Client benutzt, um das offene Objekt gegenüber dem Verzeichnisdienst zu
identifizieren. Die Funktion OpenObject benutzt die Identifikation,
um das Objekt zu identifizieren, und lokalisiert dann die Merkmale
des identifizierten Objekts. Der Funktion ReadObjekt werden eine
Handhabe zu einem offenen Objekt und eine Liste der Namen der Merkmale
dieses Objekts, die zurückzugewinnen
sind, übergeben.
Die Funktion ReadObjekt gibt die aktuellen Merkmalwerte für diese Merkmale
zurück.
Der Funktion WriteObject wird eine Handhabe zu einem offenen Objekt
und einen Liste von Merkmalnamen und Merkmalwertpaaren übergeben.
Die Funktion WriteObject setzt jedes genannte Merkmal in dem offenen
Objekt auf den Merkmalwert des Paares. Der Funktion ListObjects
wird eine Handhabe zu einem offenen Objekt übergeben, und sie gibt eine
Liste zurück,
die die Identifikation jedes Objekts enthält, das in dem offenen Objekt
enthalten ist. Der Funktion CloseObject wird eine Handhabe zu einem
offenen Objekt übergeben,
und sie schließt
das Objekt, sodass darauf mit dieser Handhabe nicht mehr zugegriffen
werden kann. Der Funktion CreateObject wird eine Objektklasse übergeben,
sie erzeugt ein Objekt der Objektklasse, die in dem offenen Objekt
enthalten ist, und gibt eine Handhabe zu dem enthaltenen Objekt
zurück.
Der Funktion DeleteObject wird eine Handhabe zu dem offenen Objekt übergeben,
und sie entfernt das offene Objekt aus seinem Behälterobjekt.
-
Die
Funktionen zum Definieren der Objektklassen sind CreateObjectClass,
DeleteObjectClass, CreateProperty, DeleteProperty, AddPropertyToObjectClass,
DeletePropertyFrom-ObjectClass
und ListPropertiesOfObjectClass. Der Funktion CreateObjectClass
wird der Name einer neuen Objektklasse übergeben, und sie erzeugt eine
neue Objektklasse. Sobald eine Objektklasse erzeugt ist, kann ein
Client Objekte dieser Objektsklasse erzeugen. Der Funktion CreateProperty
werden der Name eines Merkmals und der Merkmaltyp (z.B. Ganzzahl
oder Zeichenkette) übergeben,
und sie erzeugt ein Merkmal dieses Merkmaltyps (z.B. Merkmalname
von "Adresse" mit Merkmaltyp "Zeichenkette"). Der Funktion AddProperty-ToObjectClass werden der
Name einer Objektklasse und der Name eines Merkmals übergeben,
und sie fügt
das genannte Merkmal als ein Merkmal der genannten Objektklasse
hinzu. Der Funktion ListPropertiesOfObjectClass wird der Name einer
Objektklasse übergeben,
und sie gibt eine Liste der Merkmale zurück, die dieser Objektklasse
hinzugefügt
wurden. Die Funktionen DeleteObjectClass, DeleteProperty und DeletePropertyFromObjectClass
führen das
durch ihre Namen angedeutete Verhaften durch.
-
Die
vorliegende Efindung wird im Folgenden unter Verwendung einiger
objektorientierter Verfahren beschrieben, und daher wird eine Übersicht
von wohl bekannten objektorientierten Programmiertechniken bereitgestellt.
(Der Begriff "Objekt" hat viele verschiedene
Bedeutungen, wenn er in verschiedenen Kontexten gebraucht wird.
Im Rest des Hintergrunds wird der Begriff "Objekt" in einem objektorientierten Sinn gebraucht, um
auf eine In-Speicher-Datenstruktur zu verweisen.) Zwei übliche Eigenschaften
von objektorienterten Programmiersprachen sind die Unterstützung für Dateneinkapselung
und Daten-Hinterlassenschaft. Dateneinkapselung betrifft das Binden
von Funktionen und Daten. Hinterlassenschaft betrifft die Fähigkeit,
einen Datentyp in Form von anderen Datentypen zu deklarieren. In
der Sprache C++ werden Einkapselung und Hinterlassenschaft durch
die Verwendung von Klassen unterstützt. Eine Klasse ist ein benutzerdefinierter
Typ. Eine Klassendeklaration beschreibt die Datenelemente und Funktionselemente
der Klasse. Ein Funktionselement wird auch als ein Verfahren einer
Klasse bezeichnet. Die Datenelemente und Funktionselemente einer
Klasse werden zusammengebunden, insofern als die Funktion auf einer
Instanz der Klasse arbeitet. Ein Instanz einer Klasse wird auch
ein Objekt der Klasse genannt. Eine Klasse liefert daher eine Definition
für eine
Gruppe von Objekten mit ähnlichen
Merkmalen und gemeinsamem Verhaften.
-
Um
Speicher für
ein Objekt einer bestimmten Klasse (Typ) zuzuteilen, wird ein Objekt
eingerichtet. Sobald eingerichtet, können den Datenelementen des
einzelnen Objekts Daten zugewiesen werden. Ebenfalls können, sobald
eingerichtet, die Funktionselemente des einzelnen Objekts aufgerufen
werden, um auf die Datenelemente zuzugreifen und sie zu manipulieren.
Auf diese Weise implementieren daher die Funktionselemente das Verhalten
des Objekts, und dasObjekt liefert eine Struktur zum Einkapseln
von Daten und Verhaften in eine einzige Wesenheit.
-
Um
das Konzept der Hinterlassenschaft zu unterstützen, können Klassen aus (basierend
auf der Deklaration von) anderen Klassen abgeleitet werden. Eine
abgeleitete Klasse ist eine Klasse, die die Eigenschaften, Datenelemente
und Funktionselemente ihrer Grundklassen erbt. Eine Klasse, die
die Eigenschaften einer anderen Klasse erbt, ist eine abgeleitete
Klasse. Eine Klasse, die nicht die Eigenschaften einer anderen Klasse erbt,
ist eine Primär(Wurzel)
Klasse. Eine Klasse, deren Eigenschaften von einer anderen Klasse
geerbt werden, ist eine Grundklasse. Ein abgeleitete Klasse kann
die Eigenschaften von mehreren Klassen erben; das heißt, eine
abgeleitete Klasse kann mehrere Grundklassen haben. Dies wird als
mehrfache Hinterlassenschaft bezeichnet.
-
Eine
Klasse kann auch spezifizieren, ob ihre Funktionselemente virtuell
sind. Deklarieren, dass ein Funktionselement virtuell ist, bedeutet,
dass die Funktion durch eine Funktion des gleichen Namens und Typs in
einer abgeleiteten Klasse umgestoßen werden kann. Wenn eine
virtuelle Funktion deklariert wird, ohne Implementierung bereitzustellen,
wird sie als eine reine virtuelle Funktion bezeichnet. Eine reine
virtuelle Funktion ist eine Funktion, die mit dem reinen Spezifizierer, "=0", deklariert wird.
Wenn eine Klasse eine reine virtuelle Funktion spezifiziert, dann
muss jede abgeleitete Klasse eine Implementierung für dieses
Funktionselement spezifizieren, bevor das Funktionselement aufgerufen
werden kann. Eine Klasse, die wenigstens ein reines virtuelles Funktionselement
enthält,
ist eine abstrakte Klasse.
-
2 ist ein Blockdiagramm,
das typische Datenstrukturen veranschaulicht, die benutzt werden,
um ein Objekt darzustellen. Ein Objekt umfasst Instanzdaten (Datenelemente)
und Funktionselemente, die das Verhalten des Objekts implementieren.
Die Datenstrukturen, die zur Darstellung eines Objekts benutzt werden, umfassen
die Instanzdatenstruktur 201, die Tabelle virtueller Funktionen 202 und
die Funktionselemente 203, 204, 205.
Die Instanzdatenstruktur 201 enthält einen Zeiger auf die Tabelle
virtueller Funktionen 202 und enthält Datenelemente. Die Tabelle
virtueller Funktionen 202 enthält einen Eintrag für jedes
für das
Objekt definierte virtuelle Funktionselement. Jeder Eintrag enthält einen
Verweis auf den Code, der das entsprechende Funktionselement implementiert.
Das Layout dieses Musterobjekts entspricht Modellen, die im US Patent
Nr. 5,297,284, betitelt "A
Method for Implementing Virtual Functions and Virtual Bases in a
Compiler for an Object Oriented Programming Language" beschrieben sind.
Im Folgenden wird ein Objekt als ein Fall einer Klasse beschrieben,
wie durch die Programmiersprache C++ definiert. Eine in der Technik
erfahrene Person würde erkennen,
dass andere Objektmodelle unter Verwendung anderer Programmiersprachen
definiert werden können.
-
Ein
Vorteil der Verwendung von objektorientierten Techniken ist, dass
diese Techniken benutzt werden können,
um das Teilen von Objekten zu erleichtern. Zum Beispiel kann ein
Programm, das die Funktionselemente eines eingerichteten Elements
implementiert (ein "Server-Programm"), das Objekt mit
einem anderen Programm (ein "Client-Programm") teilen. Um einem
Objekt einer beliebigen Klasse zu erlauben, mit einem Client-Programm
geteilt zu werden, werden Schnittstellen definiert, durch die auf
ein Objekt zugegriffen werden kann, ohne dass des Client-Programm
zum Zeitpunkt der Compilation Zugriff auf die Klassendefinitionen haben
muss. Eine Schnittstelle ist ein benannter Satz von logisch verwandten
Funktionselementen. In C++ ist eine Schnittstelle eine abstrakte
Klasse ohne Datenelemente, und deren virtuelle Funktionen sind alle
rein. Eine Schnittstelle stellt daher ein veröffentlichtes Protokoll zum
Kommunizieren von zwei Programmen bereit. Schnittstellen werden
typischerweise zur Ableitung benutzt: Ein Programm definiert (implementiert)
Klassen, die Implementierungen für
die Schnittstellen, von denen die Klassen abgeleitet werden, bereitstellen.
Danach werden Objekte als Instanzen dieser abgeleiteten Klassen
erzeugt. Objekte, die aus abgeleiteten Klassen, die bestimmte Schnittstellen
implementieren, eingerichtet werden, sollen die Schnittstellen "unterstützen". Ein Objekt unterstützt, abhängig von
der gewünschten
Funktionalität,
eine oder mehrere Schnittstellen.
-
Wenn
ein Client-Programm ein Objekt zu teilen wünscht, muss das Client Programm
auf den Code zugreifen, der die Schnittstellen für das Objekt (der abgeleitete
Klassencode) implementiert. In der OLE 2.01 Umgebung, gegründet von
Microsoft Corporation in Redmont, Washington, wird, um auf den abgeleiteten
Klassencode (auch Klassencode genannt) zuzugreifen, jeder Klassenimplementierung
ein einmaliger Klassenidentifikator (ein "CLSID") gegeben. OLE 2.01 wird in "Inside OLE", 2. Ausgabe, Microsoft
Press, 1995 von Kraig Brock schmidt beschrieben. Zum Beispiel kann
Code, der ein von Microsoft Corporation entwickeltes Spreadsheet-Objekt
implementiert, einen Klassenidentifikator "MSSpreadsheet" haben, während Code, der ein von einer
anderen Firma entwickeltes Spreadsheet-Objekt implementiert, einen
Klassenidentifikator "LTSSpreadsheet" haben kann. Eine
ständige
Registrierung wird in jedem Computersystem bewahrt, die jeden CLSID
in den Code abbildet, der die Klasse implementiert. Typischerweise
wird, wenn ein Spreadsheet-Programm auf einem Computersystem installiert
wird, die ständige
Registrierung aktualisiert, um die Verfügbarkeit dieser Klasse von
Spreadsheet-Objekten widerzuspiegeln. Solange der Spreadsheet Entwickler
jedes Funktionslement, das durch die von Spreadsheet-Objekten zu
unterstützenden
Schnittstellen definiert wird, implementiert, und solange die ständige Registrierung
aufrechterhalten wird, kann das Client-Programm auf die Funktionselemente
von geteilten Spreadsheet Objekten ohne Rücksicht darauf zugreifen, welches
Server-Programm sie implementiert hat oder wie sie implementiert
wurden.
-
Da
ein Objekt einige Schnittstellen unterstützen kann und andere nicht,
kann ein Client Programm zur Laufzeit feststellen müssen, ob
ein bestimmtes Objekt eine bestimmte Schnittstelle untersützt. Um
diese Feststellung zu ermöglichen,
unterstützt
jedes COM-Objekt die IUnknown-Schnittstelle, die ein Funktionselement enthält, und
Querylnterface, die angibt, welche Schnittstellen für das Objekt
implementiert sind. Das Querylnterface-Verfahreen ist wie folgt
definiert:
virtual HRESULT Querylnterface (REFIID iid, void**ppv)
= 0;
-
Dem
Querylnterface-Verfahren wird ein Schnittstellenidentifikator in
Parameter iid (von Typ REFIID) übergeben,
und es gibt in Parameter ppv einen Zeiger auf die Implementierung
der designierten Schittstelle "iid" zurück. Das
Querylnterface-Verfahren ist typischerweise codiert, um über alle
verfügbaren
Schnittstellen des Objekts, zu dem es gehört, Bescheid zu wissen. Wenn
das Objekt die Schnittstelle nicht unterstützt, gibt das Querylnterface-Verfahren
unwahr zurück.
Der Typ HRESULT gibt einen vordefinierten Status an.
-
Die
(Unknown-Schnittstelle definiert auch die Verfahren AddRef und Release,
die zum Implementieren einer Verweiszählung benutzt werden. Wann
immer einer neuer Verweis auf eine Schnittstelle erzeugt wird, wird
das AddRef-Verfahren aufgerufen, um einen Verweiszählwert des
Objekts zu erhöhen.
Wenn ein Verweis nicht mehr gebraucht wird, wird das Release-Verfahren
aufgerufen, um den Verweiszählwert
zu dekrementieren, und wenn der Verweiszählwert auf null geht, wird
das Objekt freigesetzt.
-
Zusammenfassung der Erffindung
-
Die
Erfindung wird durch die Gegenstände
der unabhängigen
Ansprüche
bereitgestellt.
-
Bevorzugte
Ausführungen
werden in den abhängigen
Ansprüchen
definiert.
-
Die
vorliegende Erfindung stellt eine Definition für OLE-Schnittstellen und ein
Modell für
Anbieter-Software zum Zugreifen auf eine Vielzahl von Verzeichnisdiensten
in einer gleichmäßigen Weise
bereit. Jeder Verzeichnisdienstanbieter verwaltet Information bezüglich Objekten
dieses Verzeichnisdienstes. Die Art der Information, die ein Verzeichnisdienst
für ein
Objekt verwaltet, wird durch die Objektklasse des Objekts definiert. Eine
Objektklasse definiert die Merkmale (d.h. Information), die ein
Verzeichnisdienst für
Objekte dieser Objektklasse verwaltet. Jedes Merkmal hat einen Merkmalnamen
und Merkmaltyp. Ein Verzeichnisdienst hat einen Merkmalnamen für jedes
durch die Objektklasse jedes Objekts definierte Merkmal. Das Verzeichnisdienstsystem
umfasst eine Schema-Browsing-Komponente, eine Namenauflösungskomponente,
eine Bindungskomponente und eine Erweiterungskomponente. Die Schema-Browsing-Komponente
steuert das Rückgewinnen
des Merkmalnamens und Merkmalstyps jedes Merkmals jeder Objektklasse
jedes Verzeichnisdienstens. Ein Client eines Verzeichnisdienstsystems
benutzt die Schema-Browsing-Komponente, um Merkmalnamen und Merkmaltypen
der Objektklassen zurückzugewinnen.
Die Namenauflösungskomponente
steuert die Rückgewinnung
eines eindeutigen Identifikators eines Objekts innerhalb eines Verzeichnisdienstes
und das Auffinden des Objekts innerhalb des Verzeichnisdienstes.
Die Bindungskomponente steuert das Binden an ein In-Speicher-Objekt,
das ein lokalisiertes Objekt in einem Verzeichnisdienst darstellt.
Die Erweiterungskomponente steuert das Definieren neuer Objektklassen
und neuer Merkmale für
jeden Verzeichnisdienst. Ein Client des Verzeichnisdienstsystems
benutzt die Erweiterungskomponente, um neue Objektklas sen und neue
Merkmale zu definieren.
-
Kurzbeschreibung
der Zeichnungen
-
1 veranschaulicht eine Musterhierarchie
eines Verzeichnisdienstes.
-
2 veranschaulicht typische
Datenstrukturen, die zum Darstellen eines Objekts benutzt werden.
-
3A veranschaulicht die Hierarchie
von OleDs.
-
3B veranschaulicht die Beziehung
zwischen OleDs-Objekten und ihren entsprechenden Objekten in einem
Verzeichnisdienst.
-
4 ist ein Blockschaltbild
eines zum Implementieren der vorliegenden Erfindung konfigurierten Computersystems.
-
5 ist ein Flussdiagramm
der Funktion OleDsGetObject, die die Bindefunktion von OleDs ist.
-
6 ist ein Flussdiagramm
des Verfahrens IOleDs::Getlnfo.
-
7 ist ein Flussdiagramm
des Verfahrens IOleDS::Get.
-
8 ist ein Flussdiagramm
des Verfahrens IOleDsContainer::CopyHere.
-
9 ist ein Flussdiagramm
des Verfahrens IOleDs::Create.
-
10 ist ein Flussdiagramm
der Prozedur zum Anzeigen aller Namensräume.
-
Ausführliche
Beschreibung der Efindung
-
Die
vorliegende Erfindung stellt ein Rahmenwerk zum gleichmäßigen Zugriff
auf verschiedene unterschiedliche Verzeichnisdienste bereit. In
einer bevorzugten Ausführung
stellt das Verzeichnisdienstsystem, bezeichnet als OleDs, eine Architektur
bereit, die Clients erlaubt, auf den Inhalt dieser verschiedenen
Verzeichnisdienste unter Verwendung eines einzigen, gemeinsamen
Satzes von OleDs-Objekten, -Attributen und -Schnittstellen zuzugreifen.
Ein OleDs-Objekt ist eine In-Speicher-Struktur, die einem Objekt
eines Verzeichnisdienstes oder einer Objektklasse des Verzeichnisdienstes
entspricht. Wenn ein OleDs-Objekt einem Objekt entspricht, stellt
es eine Schnittstelle zum Zugreifen auf die Merkmalwerte und Verfahren
dieses Objekts bereit. Wenn ein OleDs-Objekt einer Objektklasse
entspricht, stellt es eine Schnittstelle zum Zugreifen auf die Definition
dieser Objektklasse bereit. Jeder Anbieter eines Verzeichnisdienstes
liefert eine Implementierung dieser Schnittstellen für seinen
Verzeichnisdienst, die das Verhalten seines API-Satzes in das Verhalten
dieser OleDs-Schnittstellen abbildet. Auf diese Weise kann ein Client,
der entwickelt ist, um die OleDs-Architek tur zu verwenden, auf jeden
dieser Verzeichnisdienste ungeachtet der Unterschiede in ihren API-Sätzen zugreifen.
-
OleDs
modelliert alle Verzeichnisdienste als innerhalb eines Wurzelbehälterobjekts,
bezeichnet als ein "Namensraum"-Behälter, befindlich. 3 veranschaulicht den Namensraum-Behälter. Die
Objekte in dem Namensraum-Behälter
stellen die verschiedenen Verzeichnisdienste dar. OleDs stellt eine
Schnittstelle zum Aufzählen
der in dem Namensraum-Behälter
enthaltenen Verzeichnisdienste bereit. Jeder enthaltene Verzeichnisdienst
wird durch ein OleDs-Namensraum-Behälterobjekt dargestellt. Ein
Client kann die Schnittstelle verwenden, um das Vorhandensein eines
Verzeichnisdienstes zu ermitteln, und kann auf sein Schema zugreifen,
um die Definition der Objektklassen des Verzeichnisdienstes zu ermitteln.
Das Schema enthält
eine Definition der Objektklassen des Verzeichnisdienstes. Durch
die vom OIeDs bereitgestellten Schnittstellen kann ein Client zur
Laufzeit das Vorhandensein und den Inhalt von Verzeichnisdiensten
ermitteln, die zur Kompilationszeit nicht bekannt waren.
-
Da
jeder Verzeichnisdienst typischerweise seine eigene Konvention zur
Benamung seiner Objekte hat, stellt das OleDs eine gleichförmige Benamungskonvention
bereit, die jedes Objekt in den verschiedenen Verzeichnisdiensten
ohne Konflikt eindeutig identifiziert. Dieser eindeutige Identifikator
wird als ein OleDS-Pfad bezeichnet Der OleDs-Pfad ist eine Zeichenkette,
die den Verzeichnisdienst und den Satz von eingepackten Behälterobjekten
identifiziert, die geöffnet
werden müssen,
um auf das identifizierte Objekt zuzugreifen. Das OleDs hat das
folgende Format:
-
-
Der "Namespaceldentifier" identifiziert den
Verzeichnisdienst eindeutig. Die Zeichenfolge nach dem "1" oder ":" ist
in einem vom Verzeichnisdienst unabhängigen Format. Das heißt, jeder
Verzeichnisdienst kann sein eigenes Format definieren.
-
OleDs
stellt eine Bindefunktion zum Binden eines OleDs-Pfades an ein OleDs-Objekt
bereit, das dem durch den OleDs-Pfad identifizierten Objekt entspricht.
Dieser Bindefunktion wird ein OleDs-Pfad übergeben, und sie gibt einen
Zeiger auf das dem Objekt eintsprechende OleDs-Objekt zurück. Um das
OleDs-Objekt zu binden, teilt die Bindefunktion den Namensraum-Identifikator
von dem OleDs-Pfad. Die Bindefunktion benutzt diesen Namensraum-Identifikator, um
Code zurückzugewinnen
(z.B. in einer dynamisch verbundenen Bibliothek), der den Zugriff
auf den identifizierten Namensraum implementiert. (OleDs unterhält eine
Registrierung für
Verzeichnisdienstanbieter, um die Stelle ihrer Implementierung von
OleDs-Schnittstellen
zu registrieren.) Die Bindefunktion ruft dann den rückgewonnenen
Code durch Übergeben
des OleDs-Pfades auf. Der aufgerufene Code benutzt den API-Satz
des Verzeichnisdienstes, um auf das identifizierte Objekt zuzugreifen
und das durch durch die OleDs-Schnittstelle definierte Verhalten
zu implementieren.
-
OleDs
modelliert dieObjekte jedes Verzeichnisdienstes als entweder OleDs-Behälterobjekte
oder OleDs-Blattobjekte. Um auf ein Behälterobjekt eines Verzeichnisdienstes
zuzugreifen, wird ein OleDs-Behälterobjekt
eingerichtet, das eine durch den Anbieter des Verzeichnisdienstes
bereitgestellte Implementierung hat. Desgleichen wird, um auf ein
Blattobjekt des Verzeichnisdienstes zuzugreifen, ein OleDs-Blattobjekt
eingerichtet, das eine durch den Anbieter des Verzeichnisdienstes
bereitgestellte Implementierung hat. Jedes OleDs-Objekt enthüllt eine
Schnittstelle zum Zugreifen auf die Merkmale des entsprechenden
Objekts des Verzeichnisdienstes. Jedes OleDs-Behälterobjekt enthüllt außerdem eine
Schnittstelle, über
die auf seine enthaltenen Objekt durch einen Client zugegriffen
werden kann.
-
4 veranschaulicht die Beziehung
zwischen OleDs-Objekten und ihren entsprehenden Objekten in einem
Verzeichnisdienst. Jeder Verzeichnisdienstanbieter stellt Implementierungen
jeder durch die OleDs-Objekte enthüllten Schnittstelle bereit.
Diese Implementierungen bewirken ein Abbilden des Verhaltens des API-Satres
des Anbieters in das Verhalten der OleDs-Schnittstellen. Jeder Client
kann daher gleichmäßig auf vielfache
Verzeichnisdienste unter Verwendung der Anbieter-Implementierungen
der OleDs-Schnittstellen zugreifen.
-
Um
Clienten beim Zugreifen auf die Objekte eines Verzeichnisdienstes
zu helfen, definiert OleDs ein Modell zur Darstellung des Schemas
jedes Verzeichnisdienstes. Begrifflich wird jeder Verzeichnisdienst
als ein Schemabehälterobjekt
besitzend angesehen, das ein Schemaobjekt für jede Objektklasse enthält. Das
Schemaobjekt definiert die Merkmale der Objektklasse. Dem Schemabehälter wird
ein vordefinierter Name in dem Namensraum, z.B. "Schema" zugewiesen. Um auf einen Schemabehälter zuzugreifen,
benutzt ein Client die OleDs-Bindefunktion durch Übergeben
des OleDs-Pfades des Schemas (z.B. "@WinNTDS! Schema"). Die OleDs-Bindefunktion gibt einen
Zeiger auf ein OleDs-Behälterobjekt
zurück,
das dem Schemabehälterobjekt entspricht.
Ein Client kann Schnittstellen des OleDs-Behälterobjekts benutzen, um die
enthaltenen Schemaobjekte aufzuzählen.
In dieser Weise kann ein Client die Definition der verschiedenen
Objektklassen zur Laufzeit ermitteln. Außerdem kann ein Client zusätzliche
Objektklassen durch Hinzufügen
von Schemaobjekten zu dem Schemabehälterobjekt definieren.
-
OleDs
definiert im Voraus mehrere Objektklassen, um die Implementierung
des Abbildens des Verhaltens eines Verzeichnisdienst-API-Satres
in das Verhalten der OleDs-Schnittstellen zu erleichtern. Insbesondere
stellt OleDs Objekklassendefinitionen für gemeinsame Behälterobjekte,
z.B. Organisationseinheit und Land, und für gemeinsame Blattobjekte,
z.B. ein Benutzer oder eine Ressource, bereit.
-
OleDs
definiert das Konzept eines Vorgabe-Namensraumes oder Verzeichnisdienstes.
Ein Vorgabe-Namensraum ist der Namensraum, den ein Client zu benutzen
wünscht,
wenn in dem OleDs-Pfad kein Namensraum spezifiziert ist. Die Identifikation
des Vorgabe-Namensraumes für
einen Client oder Benutzer würde typischerweise
in der durch den Client oder Benutzer indexierten Registrierung
gespeichert werden.
-
OleDs
definiert auch das Konzept eines Vorgabe-OleDs-Objekts, das durch
jeden Anbieter implementiert wird, um einem Client zu erlauben,
Objekte einer neu definierten Objektklasse dem Verzeichnisdienst
hinzuzufügen.
Ein Verzeichnisdienstanbieter würde
typischerweise eine Implementierung eines OleDs-Objekts für jede Objektklasse
in dem Verzeichnisdienst bereitstellen. Zum Beispiel kann ein Anbieter
verschiedene Implementierungen für
die Objektklassen für
ein Computerobjekt und Firmenobjekt bereitstellen. Jede Implementierung
hat Kenntnis davon, welche Merkmale für die entsprechende Objektklasse
definiert sind, und kann den API-Satz auffordern, die Werte der
Merkmale zurückzugewinnen.
Wenn jedoch ein Client ein neues Objekt zur Laufzeit definiert,
wird es keine entsprechende Implementierung geben. Folglich stellt
jeder Anbieter, der es erlaubt, dass neue Objektklassen für seinen
Verzeichnisdienst definiert werden, auch eine Implementierung eines
Vorgabe-OleDs-Objekts
bereit. Wann immer ein Client verlangt, ein OleDs-Objekt für ein Objekt
einzurichten, für
das es keine Implementierung gibt, wird ein Vorgabe-OleDs-Objekt
eingerichtet.
-
Das
Vorgabe-OleDs-Objekt enthält
den Namen der Objektklasse, der es entspricht, den es benutzt, um
die Definition der Objektklasse aus dem Schema zurückzugewinnen.
Mittels dieser Definition kann das Vorgabe-OleDs-Objekt auf das
entsprechende Objekt des Verzeichnisdienstes zugreifen.
-
3A ist ein Blockdiagramm,
das die Hierarchie des OleDs veranschaulicht. Die Hierarchie enthält einen
als "Namensräume" bezeichneten Wurzelbehälter. Der
Namensraum-Behälter enthält folgerichtig
den Namensraum für
jeden Verzeichnisdienst. 3B ist
ein Blockdiagramm, das die Architektur des OleDs veranschaulicht.
Jeder Anbieter eines Verzeichnisdienstes implementiert ein Abbilden
des Verhaltens des Anbieter-API-Satres in das Verhalten der OleDs-Schnittstellen.
Jedes OleDs-Behälterobjekt
enispricht einem Behälterobjekt
in dem Verzeichnisdienst, und jedes OleDs-Blattobjekt entspricht
einem Blattobjekt in dem Verzeichnisdienst.
-
OleDs
sorgt für
frühes
und spätes
Binden eines Client an die OleDs-Objekte. Frühes Binden bedeutet, dass der
Entwickler eines Client zur Kompilationszeit den Namen der Merkmale
jedes Objekts kennt. Der Client kann daher programmiert werden,
um auf die Werte von diesen Merkmalen unter Verwendung von Verfahren
zum "Holen" und "Ablegen" von Merkmalen (z.B. "get_Address" oder "put_Name") direkt zuzugreifen.
Jedes OleDs-Objekt enthüllt
die IDispatch-Schnittstelle (definiert in Ole 2.01), die es erlaubt,
zur Laufzeit einen Client an ein Merkmal zu binden (d.h. spätes Binden).
-
Jdes
OleDs-Objekt enthüllt
die IOleDs-Schnittstelle. Die IOleDs-Schnittstelle definiert verschiedene Attribute
des OleDs-Objekts zusammen mit Verfahren zum Zugreifen auf die Merkmale
des entsprechenden Objekts in dem Verzeichnisdienst. (Im Folgenden
betrifft der Begriff "Merkmal" Daten in einem Verzeichnisdienst,
und der Begriff "Attribut" betrifft Daten,
die durch OleDs für
die OleDs-Objekte definiert werden.) Jedes OleDs-Objekt, das ein
Behälter
ist, stellt auch die IOleDsContainer-Schnittstelle bereit. Die IOleDsContainer-Schnittstelle
definiert verschiedene Attribute, die mit Behälterobjekten und Verfahren
für manipulierte
enthaltene Objekt in Beziehung stehen. Außerdem kann jedes OleDs-Objekt
optional eine Schnittstelle benannt IOleDs<class> oder
IOleDs<class>operations bereitstellen,
wo <class> dem Namen der Objektklasse
des entsprechenden Objekts in dem Verzeichnisdienst entspricht,
und <class>operations den Operationen
entspricht, die auf einem Objekt durchgeführt werden können. Zum
Beispiel hat ein Punktqueue-Objekt Operationen wie Pausieren, Starten
und Löschen
eines Druckauftrags. Im Folgenden werden diese und andere OleDs-Schnittstellen
definiert, zusammen mit einer Beschreibung einer Beispielimplementierung
von bestimmten Verfahren der Schnittstellen.
-
4 ist ein Blockschaltbild
eines zum Implementieren der vorliegenden Erfindung konfigurierten Computersystems.
Das Computersystem 400 umfasst einen Speicher 401,
eine zentrale Verarbeitungseinheit 402, eine E/A-Schnittstelle 403,
Speichereinrichtungen 404 und eine Anzeigeeinrichtung 405.
Verschiedene Implementierungen der OleDs-Objekte werden in einem
computerlesbaren Speicher, z.B. einer Platte, gespeichert. Diese
Implementierungen werden zum Ausführen in den Computerspeicher
geladen. Der Speicher enthält
auch eine Implementierung der OleDs-Objekte 408, 411, 414 für drei Verzeichnisdienste.
Jede Implementierung der OleDs-Objekte greift auf den entsprechenden
API-Satz der Verzeichnisdienste 409, 412, 415 zu. Diese
API-Sätze
stellen Zugriff auf die Merkmale der Objekte 410, 413, 416 für den zugrunde
liegenden Verzeichnisdienst bereit. Außerdem stellt das OleDs selbst
Implementierungen der Bindefunktion, des Namensraum-Behälters und
ver schiedener OleDs-Objekte bereit, die typischen Objekten von Verzeichnisdiensten
entsprechen.
-
OleDsGetObiect-Funktion
-
5 ist ein Flussdiagramm
der Funktion OleDsGetObject, die die Bindefunktion des OleDs ist.
Der Funktion OleDsGetObject werden ein OleDs-Pfad zu einem Objekt
und ein Schnittstellen-Identifikator übergeben, und sie gibt einen
Zeiger auf die identifizierte Schnittstelle für ein OleDs-Objekt, das dieses
Objekt darstellt, zurück.
In Schritt 501 teilt die Funktion den Namensraum-Identifikator
von dem OleDs-Pfad. Die Funktion benutzt den Namensraum-Identifikator, um
die Implementierung einer von dem Anbieter des identifizierten Namensraumes
bereitgestellten Parsing-Schnittstelle zu lokalisieren. In Schritt 502 ruft
die Funktion eine Funktion CoGetClassObject (definiert durch OLE 2.01)
auf, um einen Zeiger zu einem Objekt einer Klasse Fabrik für eine von
dem Anbieter des identifizierten Namensraumes implementierte ParseDisplayName-Klasse
zurückzugewinnen.
Die Funktion erzeugt dynamisch den Klassenidentifikator der ParseDisplayName-Klasse
für den identifizierten
Namensraum. Wenn z.B. der geparste Namensraum "WinNTDS" ist, kann der Klassenidentfikator "CLSID_ PNDWinNTDS" sein. Das Klassefabrik-Objekt
richtet ein Objekt der ParsedDisplayName-Klasse ein, das die einzurichtende IParseDisplayName-Schnittstelle
enthüllt.
Die IParseDisplayName-Schnittstelle liefert ein Verfahren zum Zurückgeben
eines Monikers an das OleDs-Objekt für das durch den OleDs-Pfad
identifizierte Objekt. In Schritt 503 ruft die Funktion
das Verfahren ICIassFactory::Createlnstance durch Übergeben des
Identifikators der IParseDisplayName-Schnittstelle auf und empfängt einen
Zeiger auf die IParseDisplayName-Schnittstelle.
Das Verfahren Createlnstance erzeugt eine Instanz der durch den
dynamisch erzeugten Klassenidentifikator identifizierten Klasse.
In Schritt 504 ruft die Funktion das Verfahren IParseDisplayName::ParseDispIayName
durch Übergeben
des OleDs-Pfades auf. Das Verfahren ParseDisplayName gibt einen
Zeiger auf einen Moniker (IMoniker-Schnittstelle) für das durch
den OleDs-Pfad identifizierte Objekt zurück. In Schritt 505 ruft
die Funktion das Verfahren IMoniker::BindToObject auf, um einen
Zeiger auf das OleDs-Objekt, das das durch den OleDs-Pfad identifizierte
Objekt darstellt, zurückzugewinnen.
Die Funktion gibt dann den Zeiger auf das OleDs-Objekt zurück.
-
IOleDs-Schnittstelle
-
Die
IOleDs-Schnittstelle definiert Attribute und Verfahren, die jedem
OleDs-Objekt gemeinsam sind. Das Folgende ist die Schnittstellendefinition
zusammen mit einer Beschreibung ihrer Attribute und Verfahren:
-
-
Attribute
-
Name
Beschreibung.
-
Name
Relativer Name dieses Objekts in dem Behälterobjekt
-
OleDsPath
OleDs-Pfad dieses Objekts
-
Class
Name der Objektklasse dieses Objekts
-
GUID
Eindeutiger Identifikator für
Objekte dieser Objektklasse
-
Parent
OleDs-Pfad des Behälterobjekts
dieses Objekts
-
Schema
OleDs-Pfad des Schemaobjekts, das diese Objektklasse darstellt
-
Verfahren
-
Name
Beschreibung
-
Access
Erlangt die IOIeDsAccess-Schnittstelle (unten beschreiben) des OleDs-Zugriffssteuerobjekts, das
den Sicherheitserlaubnissen dieses Objekts entspricht.
-
PropAccess
Gibt einen Zeiger auf die OleDsAccess-Schnittstelle des abhängigen OleDs-Zugriffssteuerobjekts
auf ein Merkmal davon darstellt, zurück.
-
GetInfo
Gewinnt die Merkmalwerte dieses Objektes aus dem Verzeichnisdienst
zurück
und speichert sie in dem OleDs-Objekt. Der vHints-Parameter erlaub
einem Client, anzugeben, welche Funktionssätze zurückgewonen werden sollten, sodass
das Verfahren den Netzwerkzugriff optimieren kann.
-
SetInfo
Macht Änderungen
an diesen Objekt. Wenn Merkamle dieses Objekts geändert wurden, schreibt
das Verfahren die Merkmale aus dem OleDs-Objekt in den Verzeichnisdienst.
-
Get
Gewinnt den Wert für
ein benanntes Merkaml aus dem OleDs-Objekt zurück.
-
Put
Setzt den Wert für
ein benanntes Merkaml in das OleDs-Objekt zurück.
-
6 und 7 veranschaulichen Implementierungen
von Verfahren der IOleDs-Schnittstelle. 6 ist ein Flussdiagramm des Verfahrens
IOleDs::Getlnfo. Dieses Verfahren lädt die Merkmale für das Objekt
aus dem Verzeichnisdienst in das OleDs-Objekt. OleDs definiert einen Übergebungs-
oder Transaktionsprozess, durch den Aktualisierungen an Merkmalen
des Objekts nur in dem OleDs-Objekt gespeichert (mit dem Verfahren
Put) werden, und nur in dem Verzeichnisdienst gespeichert werden,
wenn ein Client es verlangt (mit dem Verfahren Setlnfo). Wenn ein
OleDs-Objekt erstmals eingerichtet wird, z.B., wenn die Funktion
OeDsGetObject aufgerufen wird, würde
das eingerichtete Objekt typischerweise die Handhabe enthalten,
die das Objekt für den
API-Satz des Verzeichnisdienstes identifiziert. In Schritt 601 ruft
das Verfahren die Funktion ReadObject durch Übergeben einer Handhabe zu
dem Objekt und einer Liste von Merkmalnamen für das Objekt auf. Die Funktion
Read-Object gewinnt
die Werte für
die benannten Merkmale aus dem Verzeichnisdienst zurück. In einer
Implementierung des Verfahrens Getlnfo für ein OleDs-Vorgabeobjekt gewinnt
das Verfahren eine Liste der Merkmalnamen aus dem Schemaobjekt für die Objektklasse
dieses Objekts zurück.
In Schritten 60204 durchläuft
das Verfahren eine Schleife, um die rückgewonnenen Werte in dem OLeDs-Objekt
zu speichern. In Schritt 602 wählt das Verfahren den nächsten Wert
beginnend mit dem ersten aus. Wenn in Schritt 703 alle Werte
bereits ausgewählt
wurden, kehrt das Verfahren zurück,
ansonsten fährt
das Verfahren bei Schritt 604 fort. In Schritt 604 speichert
das Verfahren den ausgewählten
Wert in dem OleDs-Objekt und springt zurück zu Schritt 602,
um den nächsten
Wert auszuwählen.
-
7. ist ein Flussdiagramm
des Verfahrens IOleDs::Get. Dem Verfahren wird ein Merkmalname übergeben,
es gewinnt den Wert des übergebenen
Merkmals aus dem OleDs-Objekt zurück und kehrt zurück.
-
IOleDsContainer-Schnittstelle
-
Die
IOleDsContainer-Schnittstelle definiert Attribute und Verfahren,
die jedem OleDs-Objekt, das ein Behälter ist, gemeinsam sind. Das
Folgende ist die Schnittstellendefinition zusammen mit einer Beschreibung ihrer
Attribute und Verfahren.
-
-
Attribute
-
Name
Beschreibung
-
Filter
Anordnung von Filtern für
die Objektlasse, die in einer gegebenen Aufizählung zurückgegeben wird. Wenn Filter
leer ist, werden alle Objekte aller Objektklassen zurückgegeben.
Jeder Anordnungseintrag hat das folgende Format
-
Count
Anzahl von OleDs-Objekten in dem Behälter, die das Filter passieren.
-
NewEnum
Aufzähler
von enthaltenen Objekten.
-
Verfahren
-
Name
Beschreibung
-
GetObject
Gibt die IOleDs-Schnittstelle des Objekts in diesem durch die Objektklasse
definierten Behälterobjekt
und den relativen Namen in dem Behälterobjekt zurück. Wenn
die Objektklasse nicht übergeben wird,
gibt das Verfahren die Schnittstelle für das erste mit diesem relativen
Namen gefundene Objekt zurück.
-
Create
Erzeugt ein Objekt der spezifizierten Objektklasse und relativen
Namen in die sem Behälterobjekt
und gibt einen Zeiger auf die IOleDs-Schnittstelle zurück. Das
Objekt wird erst wirklich in dem Verzeichnisdienst erzeugt, wenn
das Verfahren IOleDs::Setlnfo aufgerufen wird, sodass die verbindlichen
Merkmale festgelegt werden können.
-
Delete
Löscht
das durch die Objektklasse und den relativen Namen identifizierte
Objekt in diesem Behälterobjekt.
-
CopyHere
Erzeugt ein neues Objekt in diesem Behälterobjekt, das mit dem spezifizierten
Objekt identisch ist, und gibt einen Zeiger auf die IOleDs-Schnittstelle
zu dem neuen Objekt zurück.
NewName ist ein optionaler Parameter, der, wenn vorden, den Namen
des neuen Objekts in dem Behälterobjekt
enthält.
-
MoveHere
Wie Verfahren CopyHere, außer
dass das Quellenobjekt nach dem Kopieren gelöscht wird.
-
8 ist ein Flussdiagramm
des Verfahrens IOleDsContainer::CopyHere. Dieses Verfahren erzeugt eine
Kopie des spezifizierten Quellenobjekts innerhalb dieses Behälterobjekts.
In Schritt 801 bestimmt das Verfahren die Objektklasse
des zu kopierenden Objekts. In Schritt 802 erzeugt das
Verfahren ein Objekt in dem Verzeichnisdienst der bestimmten Objektklasse
durch Aufrufen der Funktion CreateObject. In Schritt 803 gewinnt
das Verfahren den OleDs-Pfad
zu dem Schemaobjekt für
diese Objektklase zurück.
In Schritt 804 ruft das Verfahren die Funktion OleDsGetObject
durch Übergeben
des OleDs-Pfades zu dem Schemaobjekt auf und gewinnt einen Zeiger
auf die IOeDs-Schnittstelle des OleDs-Schemaobjekts zurück. In Schritt 805 ruft
das Verfahren das Verfahren IOleDs::Querylntertace des OleDs-Schemaobjekts
auf, um einen Zeiger auf die IOleDsClass-Schnittstelle zurückzugewinnen.
Die IOleDsClass-Schnittstelle liefert Verfahren zur Rückgewinnung
des Namens der für
diese Objektklasse definierten Merkmale. In Schritt 806 ruft
das Verfahren das Verfahren IOleDs-Class::GetMandatoryProperties auf, um
eine Liste der obligatorischen Merkmale dieser Schemaklasse zurückzugewinnen.
In Schritt 807 ruft das Verfahren das Verfahren IOle-Ds::Properties auf,
um alle zusätzlichen
Merkmale für
diese Klasse zurückzugewinnen.
In Schritten 808-811 durchläuft
das Verfahren eine Schleife, um jeden der Werte der Merkmale aus
dem Quellen-OleDs-Objekt in das Ziel-OleDs-Objektzu kopieren. In
Schritt 808 wählt
dasVerfahren das nächste
Merkmal beginnend mit dem ersten aus. Wenn in Schritt 809 allle
Merkmale bereits ausgewählt
wurden, fährt
das Verfahren in Schritt 812 fort, ansonsten fährt das
Verfahren in Schritt 810 fort. In Schritt 810 ruft
das Verfahren das Verfahren IOleDs::Get des Quellen-OleDs-Objekts
auf, um den Wert für
das ausgewählte
Merkmal zurückzugewinnen.
In Schritt 811 speichert das Verfahren den rückgewonnenen
Wert in dem Ziel-IOieDs-Objekt und springt zurück zu Schritt 808, um das nächste Merkmal
zu wählen.
In Schritt 812 kopiert das Verfahren die Attribute des
Quellen-OleDs-Objekts in das Ziel-OleDs-Objekt und kehrt zurück.
-
9 ist ein Flussdiagramm
des Verfahrens IOleDs::Create. In Schritt 901 ruft das
Verfahren die Funktion CreateObject des Verzeichnisdienstes durch Übergeben
einer Objektklasse auf und empfängt
eine Handhabe zu einem neu erzeugten Objekt dieser Objektklasse.
-
IOleDsClass-Schnittstelle
-
Die
IOleDsClass-Schnittstelle wird durch ein OleDs-Schemaobjekt enthüllt, um
Zugriff auf die Definition der Objektklasse bereitzustellen. Das
Folgende ist die Schnittstellendefintion zusammen mit einer Beschreibung
ihrer Attribute und Verfahren.
-
Schnittstelle
IOleDsClass: IOleDS
-
Attribute
-
Name
Beschreibung
-
CLISD
CLISD des Codes, der das OleDs-Objekt für diese Objektklasse implementiert.
-
OID
Namensraumspezifischer Identifikator, der diese Objektklasse definiert.
Dieser wird bereitgestellt, um Schemaerweiterung über OleDs
in Namensräumen
zu erlauben, die namensraumspezifische OIDs für Objektklassen bentötigen.
-
Abstrakt
Boolescher Wert, der angibt, ob diese Objektklasse abstrakt ist.
-
Mandatory
Properties Liste der Merkmale für
diese objektklasse festgelegt werden müssen, um in einen Speicher
geschrieben zu werden.
-
Primary
Interface der Primärschnittstellen-Identifikator
für Objekte
dieser Objektklasse. Dieser ist der IID für die Schnittstelle, die die
Klasse definiert, z.B. die "Benutzer"-Klasse, wenn durch
unterstützende
IOIeDsUser definiert.
-
DerivedFrom
Anordnung von OleDs-Pfadketten, die die direkten Überklassen
angeben, aus denen dieses Objekt abgeleitet wurde.
-
Container
Merkmal, das bestimmt, dass diese Objektklasse ein Behälter ist.
-
HelpFileName
Name einer Hilfedatei, die weitere iformation über Objekte dieser Objektklasse
enthält.
-
HelpFileContext
Context-ID in HelpFileName, wo spezifische Information über diese
Objektklasse gefunden werden kann.
-
Verfahren
-
Name
Beschreibung
-
Attributes
gibt eine Sammlung von OleDs-objekten zurück die zusatzliche attribute
dieses Merkmals beschreiben Attributobjekte sind anbieterspezifisch.
-
IOleDsProperty-Schnittstelle
-
OleDsdefiniert
ein OleDs-Merkmalobjekt, das jedem Merkmal einer Objektklasse entspricht.
Ein OleDs-Merkmalobjekt enhüllt
eine Schnittstelle zur Rückgewinnung
der Definition des Merkmals. Das Folgende ist die Definition der
Schnittstelle zusammen mit einer Beschreibung der Attribute und
Verfahren.
-
interface
IOleDsProperty:IOleDs
-
Attribute
-
Name
Beschreibung
-
OleDsNames
Anordnung von Zeichenketten, die die Namen enthalten, durch die
OleDs auf dieses Merkmal zugreifen kann.
-
DsNames
Anordnung von Zeichenketten, die die Namen enthalten, durch die
der zugrunde liegende Namensraum auf dieses Merkmal zugreifen kann.
-
OID
Der namensraumspezifische Objektidentifikator, der dieses Merkmal
definiert.
-
Syntax
Relativer Pfad des Schema-Syntaxobjekts, das die Syntax dieses Merkmals
definiert. Relativ zu dem aktuellen Schemabehälter.
-
MaxRange
Obergrenze der dem Merkmal zugewiesenen Werte.
-
MinRange
Untergrenze der dem Merkmal zugewiesenen Werte.
-
Normal
Wert, der bestimmt, ob dieses Merkmal normal wiederholt werden sollte.
-
MultiValued
Wert, der bestimmt, ob dieses Merkmal mehrwertig ist.
-
Verfahren
-
Name
Beschreibung
-
Attribute
Gibt eine Sammlung von OleDs-Objekten zurück, die zusätzliche Attribute dieses Merkmals beschreiben.
-
IOleDs<Class> -
Schnittstelle
-
OleDs
definiert, dass jede Objektklasse eine Schnittstelle mit Namen IOieDs<class> unterstützen kann,
wo <class> der Name der Objektklasse
ist. Diese Schnittstelle hat ein Verfahren, wobei jeder Funktionssatz
durch die Objektklasse unterstützt
wird, das einen Zeiger auf ein OleDsFunctionalSet-Objekt für den Funktionssatz
zurückgibt.
Das Folgende ist eine Beschreibung einer Muster-Funktionssatzschnittstelle.
-
Schnittstelle
IOleDsUser: IOleDs
-
OleDs Obiektklassendefinitionen
-
OleDs
definiert verschiedene Objektklassen für Behälter- und Blattobjekte. Die
folgenden Objektklassen werden für
Behälterobjekte
durch OleDs definiert:
- Namensräume
- Namensraum
- Land
- Lokalität
- Organisation
- Bereich
- Organisationseinheit
- Computer
- Dateiservice
-
Die
folgenden Objektklassen werden von OleDs für Blattobjekte definiert:
- Benutzer
- Gruppe
- Alias
- Service
- Druckschlange
- Druckauftrag
- Druckeinrichtungssitzung
- Ressource
- Dateisharing
-
Das
Namensräumeobjekt
ist ein Behälter
der Namensraumobjekte. Die Implementierung des Namensräumeobjekts
ist Teil von OleDs. Das Namensräumeobjekt
enthüllt
die IOleDs-Namensräume-Schnittstelle.
Diese Schnittstelle wird unten gezeigt.
-
Schnittstelle
IOleDsNamespaces: IolsDs
-
-
Das
Namensraumobjekt ist ein Behälterobjekt,
das die Quelle aller OleDs-Objekte für einen gegebenen Namensraum
ist. Das Länderobjekt
ist ein Behälterobjekt
mit Merkmalen, die ein Land betreffen. Das Lokalitätsobjekt
ist ein Behälterobjekt
mit Merkmalen, die eine Lokalität
betreffen (z.B. Staat). Das Folgende ist eine Defintion einer Schnittstelle
zum Erlangen und Festlegen der Merkmale eines Lokalitätsobjekts.
-
Interface
IOIeDsFSLocalityGeneralInfo: IDispatch
-
-
Verfahren
-
Name
Beschreibung
-
Access
Gibt einen Zeiger auf die IOIeDsAccess-Schnittstelle auf dem abhängigen Zugriffssteuerobjekt zurück, das
die Zugriffssteuerung auf dieser Schnittstelle darstellt.
-
PropAccess
Gibt einen Zeiger auf die IOleDsAccess-Schnittstelle auf dem abhängigen Zugriffssteuerobjekt
zurück,
das die Zugriffssteuerung auf ein Merkmal auf dieser Schnittstelle
darstellt, wie durch PropName angegeben.
-
Attribute
-
Name
Beschreibung
-
Description
Text, der die Lokalität
beschreibt.
-
LocalityName
Lokalistätsname.
Der Lokalistätsname
identifiziert ein geographisches Gebiet, in dem sich der Behälter physikalisch
befindet.
-
PostalAddress
Haupt Postadresse der Lokalität.
-
SeeAlso
Anordnung von Namen anderer Verzeichnisobjekte, die für dieses
Objekt relevant sein können.
-
Jede
der OleDs-definierten Objektklassen definiert Merkmale, die Objekte
dieser Objektklasse betreffen. Das Bereichsobjekt entspricht einem
Bereich in einem Computersystem und hat einen Funktionssatz mit Merkmalen
(z.B. Passwörter),
die sich auf das Bereichsobjekt beziehen. Das Organisationseinheitobjekt
entspricht einer Wesenheit, z.B. eine Firma. Das Computerobjekt
entspricht einem Computer in einem Bereich. Das Benutzerobjekt hat
einen Geschäftsinformations-,
Kontobeschränkungs-,
Kontostatistik- und anderen Informationsfunktionssatz, um einen
Benutzer zu beschreiben. Der Geschäftsinformations-Funktionssatz
enthält Merkmale
bezüglich
der Beschreibung eines Geschäftes,
z.B. Land, Divi sion, Abteilung, Manager oder Dienststellen. Der
Kontobeschränkungs-Funktionssatz
enthält
Merkmale, die die allgemeinem Eigenschaften des Benutzerkontos beschreiben,
z.B. Konto gesperrt, Zahl von Stunden, die dem Benutzer zum Einloggen
erlaubt sind, usw. Der Kontostatistik-Funktionssatz hat Merkmale,
die Statistiken des Benutzerkontos spezifizieren, z.B. wann das
Passwort zum letzten Mal geändert
wurde, oder wann sich der Benutzer das letzte Mal in das Konto eingeloggt
hat. Der andere Informations-Funktionssatz enthält Merkmale, die verschiedenartige
Benutzerinformation betreffen, z.B. E-Mail-Adresse und Heimverzeichnis.
-
Beispiel-Client
von OleDs
-
10 ist ein Flussdiagramm
der Prozedur zum Anzeigen aller Namensräume. Diese Prozedur veranschaulicht,
wie ein Client von OleDs die Namen aller Namensräume rückgewinnen würde. In
Schritt 1001 ruft die Prozedur die Funktion CoGetClassObject
durch Übergeben
der Klasse für
das OleDs-Namensräumeobjekt
und des Schnittstellen-Identifikators für die IClassFactory-Schnittstelle
auf. Die Funktion gibt einen Zeiger auf eine Klasse-Fabrik-Schnittstelle für das OleDs-Namensräumeobjekt
zurück.
In Schritt 1002 ruft die Prozedur das Verfahren IClassFactory::Createlnstance
durch Übergeben
des Schnittstellen-Identifikators für die IOleDsContainer-Schnittstelle
auf. Das Verfahren erzeugt eine Instanz des OleDs-Namensräumeobjekts
und gibt einen Zeiger auf die IOleDsContainer-Schnittstelle zurück. In Schritt 1003 ruft
die Prozedur das Verfahren IOleDsContainer::get_NewEnum auf, um
einen Aufzähler
für das
Namensräumeobjekt
zurückzugewinnen.
In Schritten 1004–1008 durchläuft die
Prozedur eine Schleife, um jeden Namensraum aufzuzählen, und
zeigt den Namensraum an. In Schritt 1004 ruft die Prozedur
das Verfahren IEnumerator::Next auf, um einen Zeiger auf die IUnknown-Schnittstelle
für ein
Namensraumobjekt zurückzugewinnen.
Wenn in Schritt 1005 alle Namensräume bereits aufgezählt wurden,
kehrt die Prozedur zurück,
andernfalls fährt
die Prozedur in Schritt 1006 fort. In Schritt 1006 ruft
die Prozedur das Verfahren IUnknown::Quenlnterface auf, um einen
Zeiger auf die IOleDs-Schnittstelle für das Namensraumobjekt zurückzugewinnen.
In Schritt 1007 ruft die Prozedur das Verfahren IOleDs::
get narre auf, um den mit dem Namensraumobjekt verbundenen Namen
zurückzugewinnen.
In Schritt 1008 zeigt die Prozedur den rückgewonnenen
Namen an und springt dann zurück
zu Schritt 1004, um das nächste Namensraumobjekt aufzuzählen.
-
Obwohl
die vorliegende Erfindung in Form einer bevorzugten Ausführung beschrieben
wurde, ist nicht beabsichtigt, die Erfindung auf diese Ausführung zu
beschränken.
Der Umfang der vorliegenden Erfindung wird in den folgenden Ansprüchen definiert.