public ADObject[] ShowObjectPicker(IntPtr parentHandle) { using (logX.loggerX.InfoCall()) { packLPArray packedAttributeList = null; DSOP_SCOPE_INIT_INFO[] scopeInitInfo = new DSOP_SCOPE_INIT_INFO[2]; DSObjectPicker picker = new DSObjectPicker(); DSOP_INIT_INFO initInfo = new DSOP_INIT_INFO(); IDataObject dataObj = null; logX.loggerX.Debug("Initialize AD Picker"); IDsObjectPicker ipicker = Initialize(ref picker, ref packedAttributeList, ref scopeInitInfo, ref initInfo); logX.loggerX.Debug("Invoke AD Picker Dialog"); ipicker.InvokeDialog(parentHandle, out dataObj); return(ProcessSelections(dataObj)); } }
/// <summary> /// /// </summary> /// <returns></returns> private IDsObjectPicker Initialize(ref DSObjectPicker picker, ref packLPArray packedAttributeList, ref DSOP_SCOPE_INIT_INFO[] scopeInitInfo, ref DSOP_INIT_INFO initInfo) { IDsObjectPicker ipicker; ipicker = (IDsObjectPicker)picker; using (logX.loggerX.InfoCall()) { logX.loggerX.Debug("Initialize 1st search scope"); // Initialize 1st search scope scopeInitInfo[0].cbSize = (uint)Marshal.SizeOf(typeof(DSOP_SCOPE_INIT_INFO)); scopeInitInfo[0].flType = DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_GLOBAL_CATALOG; scopeInitInfo[0].flScope = DSOP_SCOPE_INIT_INFO_FLAGS.DSOP_SCOPE_FLAG_STARTING_SCOPE | DSOP_SCOPE_INIT_INFO_FLAGS.DSOP_SCOPE_FLAG_WANT_DOWNLEVEL_BUILTIN_PATH | DSOP_SCOPE_INIT_INFO_FLAGS.DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS | DSOP_SCOPE_INIT_INFO_FLAGS.DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS; scopeInitInfo[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_INCLUDE_ADVANCED_VIEW | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_USERS | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_BUILTIN_GROUPS | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_UNIVERSAL_GROUPS_DL | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_UNIVERSAL_GROUPS_SE | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_GLOBAL_GROUPS_DL | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_GLOBAL_GROUPS_SE | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_DOMAIN_LOCAL_GROUPS_DL | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE; scopeInitInfo[0].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FLAGS.DSOP_DOWNLEVEL_FILTER_USERS | DSOP_DOWNLEVEL_FLAGS.DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS | DSOP_DOWNLEVEL_FLAGS.DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS; scopeInitInfo[0].pwzADsPath = null; scopeInitInfo[0].pwzDcName = null; scopeInitInfo[0].hr = 0; logX.loggerX.Debug("Initialize 2nd search scope"); // Initialize 2nd search scope scopeInitInfo[1].cbSize = (uint)Marshal.SizeOf(typeof(DSOP_SCOPE_INIT_INFO)); scopeInitInfo[1].flType = DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_TARGET_COMPUTER | DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN | DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN | DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN | DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_GLOBAL_CATALOG | DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN | DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN | DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE | DSOP_SCOPE_TYPE_FLAGS.DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE; scopeInitInfo[1].flScope = DSOP_SCOPE_INIT_INFO_FLAGS.DSOP_SCOPE_FLAG_WANT_PROVIDER_GC | DSOP_SCOPE_INIT_INFO_FLAGS.DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS | DSOP_SCOPE_INIT_INFO_FLAGS.DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS; scopeInitInfo[1].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_INCLUDE_ADVANCED_VIEW | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_USERS | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_BUILTIN_GROUPS | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_UNIVERSAL_GROUPS_DL | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_UNIVERSAL_GROUPS_SE | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_GLOBAL_GROUPS_DL | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_GLOBAL_GROUPS_SE | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_DOMAIN_LOCAL_GROUPS_DL | DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE; scopeInitInfo[1].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FLAGS.DSOP_DOWNLEVEL_FILTER_USERS | DSOP_DOWNLEVEL_FLAGS.DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS | DSOP_DOWNLEVEL_FLAGS.DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS; scopeInitInfo[1].pwzADsPath = null; scopeInitInfo[1].pwzDcName = null; scopeInitInfo[1].hr = 0; logX.loggerX.Debug("Allocate unmanaged mem for scope searchers"); // Allocate memory from the unmananged mem of the process, this should be freed later!?? IntPtr refScopeInitInfo = Marshal.AllocHGlobal (Marshal.SizeOf(typeof(DSOP_SCOPE_INIT_INFO)) * 2); logX.loggerX.Debug("Marshal 1st search scope"); // Marshal structs to pointers Marshal.StructureToPtr(scopeInitInfo[0], refScopeInitInfo, false); logX.loggerX.Debug("Marshal 2nd search scope"); //SQLsecure 3.1 (Tushar)--Making it int64 to make sure the addition does not overflow range of integer. Marshal.StructureToPtr(scopeInitInfo[1], (IntPtr)((Int64)refScopeInitInfo + Marshal.SizeOf (typeof(DSOP_SCOPE_INIT_INFO))), false); logX.loggerX.Debug("Initialize initInfo structure"); // Initialize structure with data to initialize an object picker dialog box. initInfo.cbSize = (uint)Marshal.SizeOf(initInfo); initInfo.pwzTargetComputer = null; // local computer initInfo.cDsScopeInfos = 2; initInfo.aDsScopeInfos = refScopeInitInfo; // Flags that determine the object picker options. Allow user to select // multiple objects and specify that this is not a domain controller initInfo.flOptions = /*DSOP_INIT_INFO_FLAGS.DSOP_FLAG_MULTISELECT | */ DSOP_INIT_INFO_FLAGS.DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK; //initInfo.flOptions = 0; logX.loggerX.Debug("Pack array"); packedAttributeList = new packLPArray(AttributeList); initInfo.cAttributesToFetch = (uint)packedAttributeList.Length; initInfo.apwzAttributeNames = packedAttributeList.arrayPtr; logX.loggerX.Debug("ipicker.Initialize"); // Initialize the Object Picker Dialog Box with our options ipicker.Initialize(ref initInfo); } return(ipicker); }