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".
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..0] of 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].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 TYPES = DSOP_SCOPE_TYPE_GLOBAL_CATALOG;
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;
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;
SID_ATTRIBUTE_INDEX = 0; DISPLAYNAME_ATTRIBUTE_INDEX = 1; EMAILADRESS_ATTRIBUTE_INDEX = 2; USER_ACCOUNT_NAME_ATTRIBUTE_INDEX = 3;
type TOleVariantArray = array [0..(MaxInt div SizeOf(OleVariant)) - 1] of OleVariant; POleVariantArray = ^TOleVariantArray; var ObjPicker, Picker: IDsObjectPicker; InitInfo: TDsOpInitInfo; ScopeInitInfo: array [0..1] of TDsOpScopeInitInfo; DataObj, TestOBj: IDataObject; Format: TFormatEtc; Medium: TStgMedium; SelectionList: PDsSelectionList; Selection: TDsSelection; HR: HResult; Attributes: array [0..3] of WideString; Attribute: OleVariant; UserInfo: TUser; begin CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
if SUCCEEDED(CoCreateInstance(CLSID_DsObjectPicker, nil, CLSCTX_INPROC_SERVER, IID_IDsObjectPicker, Picker)) then begin if SUCCEEDED(InitObjectPicker(Picker)) then begin HR := 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
Narses: Code- durch Delphi-Tags ersetztModeriert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 07.08.2009 um 14:37