By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
425,992 Members | 891 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 425,992 IT Pros & Developers. It's quick & easy.

ObjectPicker Wrapper and Marshaling

P: n/a
I'm tring to implement the ObjectPicker for a project I'm working on. I'm
using the DSObjectPickerWrapper found at
http://dotnet.org.za/armand/articles/2453.aspx

This works fine as is, but I need to get additional Attributes back from the
Picker specifically "objectSid" Unfortunately, I can figure out how to
marshal the initInfo.apwzAttributeNames Property. In the API documention
for the ObjectPicker, it is defined as a PCWSTR data type "Pointer to an
array of null-terminated Unicode strings that contain the names of the
attributes to retrieve for each selected object."

I've tried this several ways, but I can't figure out how to properly marshal
this datatype. Here is the code for the Initialize Method

private IDsObjectPicker Initialize()
{

DSObjectPicker picker = new DSObjectPicker();

IDsObjectPicker ipicker = (IDsObjectPicker)picker;

DSOP_SCOPE_INIT_INFO[] scopeInitInfo = new
DSOP_SCOPE_INIT_INFO[2];

// 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_CATAL OG;
//Convert.ToUInt32("3FE",16);

scopeInitInfo[0].flScope =
DSOP_SCOPE_INIT_INFO_FLAGS.DSOP_SCOPE_FLAG_DEFAULT _FILTER_COMPUTERS + 1; //
Starting !?

scopeInitInfo[0].FilterFlags.Uplevel.flBothModes =
DSOP_FILTER_FLAGS_FLAGS.DSOP_FILTER_COMPUTERS + 1; // +1 = advanced view,
Check MSDN for the available options

scopeInitInfo[0].FilterFlags.flDownlevel =
DSOP_DOWNLEVEL_FLAGS.DSOP_DOWNLEVEL_FILTER_COMPUTE RS;

scopeInitInfo[0].pwzADsPath = null;

scopeInitInfo[0].pwzDcName = null;

scopeInitInfo[0].hr = 0;

// Initialize 2nd search scope

scopeInitInfo[1].cbSize =
(uint)Marshal.SizeOf(typeof(DSOP_SCOPE_INIT_INFO)) ;

scopeInitInfo[1].flType = Convert.ToUInt32("37F",16);

scopeInitInfo[1].flScope =
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 =
Convert.ToUInt32("3FF",16);

scopeInitInfo[1].FilterFlags.flDownlevel =
DSOP_DOWNLEVEL_FLAGS.DSOP_DOWNLEVEL_FILTER_ALL_WEL LKNOWN_SIDS + 7;

scopeInitInfo[1].pwzADsPath = null;

scopeInitInfo[1].pwzDcName = null;

scopeInitInfo[1].hr = 0;

// 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);

// Marshal structs to pointers

Marshal.StructureToPtr (scopeInitInfo[0],

refScopeInitInfo,true);

Marshal.StructureToPtr (scopeInitInfo[1],

(IntPtr) ((int) refScopeInitInfo + Marshal.SizeOf

(typeof (DSOP_SCOPE_INIT_INFO))),true);

// Initialize structure with data to initialize an
object picker dialog box.

DSOP_INIT_INFO initInfo = new DSOP_INIT_INFO ();

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_COMPUTE R_DC_CHECK;

// We're not retrieving any additional attributes

initInfo.cAttributesToFetch = 0;

initInfo.apwzAttributeNames = IntPtr.Zero;

// Initialize the Object Picker Dialog Box with our
options

ipicker.Initialize (ref initInfo);

return ipicker;

}

Thanks in Advance for any assistance.

Rodger
Nov 16 '05 #1
Share this question for a faster answer!
Share on Google+

This discussion thread is closed

Replies have been disabled for this discussion.