Re: Using Generics with System.DirectoryServices
- From: "Sean Chambers" <dkode8@xxxxxxxxx>
- Date: 10 Oct 2006 06:35:46 -0700
All of my apps that use AD are still on .NET 1.1, but to the best of my
knowledge there have been a number of changes to DirectoryServices in
..net 2.0
First, I never used the WinNT objects, I always used LDAP. I didn't
need backwards compatibility and it just worked the first time I tried
it, so in that sense I'm not sure how the WinNT query prefix works
For more information on DirectoryServices take a look here:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/implementing_adsi_providers.asp
that link talks about the ADSI providers which probably supports
generics. The method your trying doesn't seem to support generics,
especially since it seems to be returning a COM object.
hope that helps!
sean
Mark Rae wrote:
Hi,
I'm in the process of updating an ASP.NET v1.1 web app to v2. The app uses
ActiveDirectory a great deal, and I'm trying to use the new
System.Collections.Generic namespace where possible, having been advised by
several luminaries that that is a "good thing to do"... :-)
However, I'm experiencing a problem with the IEnumerable interface. (N.B. I
understand fully that I should be using the LDAP provider instead of the
WinNT provider - I'm in the process of fixing that too, but that's not my
most pressing problem.)
I use the following function to return a list of all users in a group:
using System;
using System.Collections;
using System.Collections.Generic;
using System.DirectoryServices;
public static List<string> GetGroupsForUser(string pstrUser)
{
DirectoryEntry objADEntry = null;
DirectoryEntry objUser = null;
object objChildren = null;
List<string> lstGroups = new List<string>();
try
{
objADEntry = new DirectoryEntry("WinNT://" + mstrDomain + ",
domain");
objUser = objADEntry.Children.Find(pstrUser, "user");
objChildren = objUser.Invoke("Groups");
foreach (object objChild in (IEnumerable)objChildren)
{
DirectoryEntry objGroup = new DirectoryEntry(objChild);
lstGroups.Add(objGroup.Name.ToLower());
}
return lstGroups;
}
catch (Exception)
{
throw;
}
}
It works well enough. However, when I rem out the using System.Collections;
namespace reference, the code fails and tells me that there is no support
for IEnumerable taking no arguments. Fair enough.
If I amend the line in question to:
foreach (object objChild in (IEnumerable<DirectoryEntries>)objChildren)
That returns the following error:
Unable to cast COM object of type 'System.__ComObject' to interface type
'System.Collections.Generic.IEnumerable`1[System.DirectoryServices.DirectoryEntries]'.
This operation failed because the QueryInterface call on the COM component
for the interface with IID '{AEF9EC8A-1E73-365B-8DA2-800A3A6166E6}' failed
due to the following
error: No such interface supported (Exception from HRESULT: 0x80004002
(E_NOINTERFACE)).
At this point, I'm pretty much out of my depth. Therefore, I'd be grateful
to know:
1) if what I'm doing is a worthwhile exercise, or whether I should just
continue with the old IEnumerable object in the old System.Collections
namespace
2) apart from replacing WinNT with LDAP, which I'm in the process of doing,
is there a more efficient method for returning a list of groups to which a
user belongs?
Any assistance gratefully received.
Mark
.
- Follow-Ups:
- Re: Using Generics with System.DirectoryServices
- From: Mark Rae
- Re: Using Generics with System.DirectoryServices
- References:
- Using Generics with System.DirectoryServices
- From: Mark Rae
- Using Generics with System.DirectoryServices
- Prev by Date: C# click once application with report and reference to assembly
- Next by Date: Re: VS2005: How to synchronize active source file and Solution explorer View
- Previous by thread: Using Generics with System.DirectoryServices
- Next by thread: Re: Using Generics with System.DirectoryServices
- Index(es):
Relevant Pages
|