Entwickler-Ecke

Windows API - Benutzerauswahl Active Directory mit Delphi 6 und Vista32


xthing - Fr 07.08.09 14:30
Titel: Benutzerauswahl Active Directory mit Delphi 6 und Vista32
Hallo zusammen, ich habe ein Programm geschrieben um ein Benutzerauswahlfenster für das Active Directory zu öffnen. Jedoch, wenn ich das Programm starte, wirs das Fenster kurz geöffnet und dann wieder geschlossen. Ich sehe nur ein kurzes Aufpoppen des Fensters. Das ganze geschieht mit Delphi 6 und Vista32. Geschrieben habe ich das Programm unter XP und da funktioniert es, ohne Probleme. WEnn ich die Exe dann zum Vistarechner kopiere, kommt der besagte Fehler. UAC hab ich bereits ausgeschaltet, als Admin laufen lassen, Kompatibilitätsmodis ausprobiert. Nichts hilft. Es erscheint dann noch die Meldung: "Falscher Parameter".

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
function InitObjectPicker(Picker: IDsObjectPicker): HRESULT;
var
  ScopeInit: array [0..0of TDSOPScopeInitInfo;
  InitInfoTst: TDSOPInitInfo;
begin
  if nil = Picker then
    Result := E_INVALIDARG
  else
  begin
    ZeroMemory(@ScopeInit, SizeOf(ScopeInit));
    ScopeInit[0].cbSize := SizeOf(TDSOPScopeInitInfo);
    ScopeInit[0].flType := DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN;

   //ScopeInit[0].flType := DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN;
    ScopeInit[0].flScope := DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN;
    ScopeInit[0].FilterFlags.Uplevel.flBothModes := DSOP_FILTER_USERS;
    ScopeInit[0].FilterFlags.flDownlevel := DSOP_DOWNLEVEL_FILTER_USERS;

    ZeroMemory(@InitInfoTst, SizeOf(InitInfoTst));
    InitInfoTst.cbSize := SizeOf(InitInfoTst);
    InitInfoTst.cDsScopeInfos := SizeOf(ScopeInit) div SizeOf(TDSOPScopeInitInfo);
    InitInfoTst.aDsScopeInfos := @ScopeInit;
    InitInfoTst.flOptions := DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK;

    Result := Picker.Initialize(@InitInfoTst);
  end;
end;

function TActiveDirectoryDialog.GetSidFromObjectPicker() : TUser;
Begin
  // Filter für Typen
  TYPES =
    DSOP_SCOPE_TYPE_GLOBAL_CATALOG;

  // Filter für Scopes
  SCOPES =
    DSOP_SCOPE_FLAG_STARTING_SCOPE or
    DSOP_SCOPE_FLAG_WANT_PROVIDER_GC or
    DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS or
    DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS;


  // Filter für Gruppen
  ALL_SECURITY_GROUPS =
    DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE
    or DSOP_FILTER_BUILTIN_GROUPS
    or DSOP_FILTER_GLOBAL_GROUPS_SE
    or DSOP_FILTER_UNIVERSAL_GROUPS_SE;



  // Konstanten zum Auslesen der Attribute
  SID_ATTRIBUTE_INDEX = 0;
  DISPLAYNAME_ATTRIBUTE_INDEX = 1;
  EMAILADRESS_ATTRIBUTE_INDEX = 2;
  USER_ACCOUNT_NAME_ATTRIBUTE_INDEX = 3;

type
  // TOleVariantArray dient dem einfacheren Zugriff auf pvarFetchedAttributes Array
  TOleVariantArray = array [0..(MaxInt div SizeOf(OleVariant)) - 1of OleVariant;
  POleVariantArray = ^TOleVariantArray;
var
  ObjPicker, Picker: IDsObjectPicker;             // Das Object Picker COM object
  InitInfo: TDsOpInitInfo;                // Der Initalization record
  ScopeInitInfo: array [0..1of TDsOpScopeInitInfo; // Der Scope
  //ScopeInitInfo: array [0..1] of TDsOpScopeInitInfo; // Der Scope
  DataObj, TestOBj: IDataObject;                   // für die Selection list verwendet
  Format: TFormatEtc;                     // für die Selection list verwendet
  Medium: TStgMedium;                     // für die Selection list verwendet
  SelectionList: PDsSelectionList;        // Liste der selektierten Objekte
  Selection: TDsSelection;                // Selektiertes Objekt
  HR: HResult;                            // Method call result
  Attributes: array [0..3of WideString; // Array mit angeforderten Attributen
  Attribute: OleVariant;                  // Wert des angeforderten Attributs
  UserInfo: TUser;        // Struktur für die Rückgab der Benutzer Infos
begin
  // COM initialisieren
  CoInitializeEx(nil, COINIT_APARTMENTTHREADED);


  // Object Picker object erzeugen
  if SUCCEEDED(CoCreateInstance(CLSID_DsObjectPicker, nil,
    CLSCTX_INPROC_SERVER, IID_IDsObjectPicker, {Obj}Picker))
  then begin
     if SUCCEEDED(InitObjectPicker(Picker){ObjPicker.Initialize(@InitInfo)}then begin
      // Dialog anzeigen
        HR := {Obj}Picker.InvokeDialog(0, DataObj);
        end;
   end;
end;


Sorry, wenn der Code etwas wirr wirkt, aber ich habe viel getestet. Natürlich muss auch alles sauber abgebaut werden.

Natürlich ahbe ich mit ScopInitInfo, andere Einstellungen getestet.

Kann mir eine vielleicht einer von Euch helfen?

Danke schon mal.

Gruss
xthing

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 07.08.2009 um 14:37