473,398 Members | 2,812 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,398 software developers and data experts.

DirectoryServices bug?

Hi, I'm building a small desktop app in VS Std 2005 with C# and .net
2.0. I've managed to get the code together to query the ldap my company
has, but every time I attempt to access a specific property a COM
Exception gets thrown, and I can't figure out why. This is a desktop
app.

example("ldap.example.com", "ou=People,dc=example,dc=com");

public void example(string server, string ou) {
searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + server
+ "/" + ou, "", "", AuthenticationTypes.ReadonlyServer));

searcher.Filter = "(uid=wsmith)";
SearchResultCollection results = searcher.FindAll();
Console.WriteLine((string)results[0].GetDirectoryEntry().Properties["gPhotoID"]);
// OFFENDING LINE!
}

So that's pretty much the smallest bit of code I can use and get the
error. All the other properties I've tried to access so far have worked
just fine, I've even found some properties to be a collection of values
which works just fine. The gPhotoID should contain a url to a picture
which would look like
"http://intranet.example.com/employees/pictures/18273010.JPG".

The error that I'm getting is:
System.Runtime.InteropServices.COMException was unhandled
Message="Unknown error (0x8000500c)"
Source="System.DirectoryServices"
ErrorCode=-2147463156
StackTrace:
at
System.DirectoryServices.PropertyValueCollection.P opulateList()
at
System.DirectoryServices.PropertyValueCollection.. ctor(DirectoryEntry
entry, String propertyName)
at
System.DirectoryServices.PropertyCollection.Proper tyEnumerator.get_Entry()
at
System.DirectoryServices.PropertyCollection.Proper tyEnumerator.get_Current()
at UserManager.UserFactory.Find(String criteria) in D:\My
Documents\Visual Studio
2005\Projects\UserManager\UserManager\UserFactory. cs:line 58
at UserManager.UserFactory.FindByUnix(String unix) in D:\My
Documents\Visual Studio
2005\Projects\UserManager\UserManager\UserFactory. cs:line 26
at UserManagerTest.Program.Main(String[] args) in D:\My
Documents\Visual Studio
2005\Projects\UserManagerTest\UserManagerTest\Prog ram.cs:line 10
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[]
args)
at System.AppDomain.ExecuteAssembly(String assemblyFile,
Evidence assemblySecurity, String[] args)
at
Microsoft.VisualStudio.HostingProcess.HostProc.Run UsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context( Object
state)
at System.Threading.ExecutionContext.Run(ExecutionCon text
executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

I can't seem to find a solution. I've been googling for over an hour,
and most of the answers I find pertain to credential issues, and
asp.net issues. Can someone please offer assistance?

Thanks,
Will

Nov 16 '06 #1
6 5435
>example("ldap.example.com", "ou=People,dc=example,dc=com");
>
public void example(string server, string ou) {
searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + server
+ "/" + ou, "", "", AuthenticationTypes.ReadonlyServer));

searcher.Filter = "(uid=wsmith)";
SearchResultCollection results = searcher.FindAll();
Console.WriteLine((string)results[0].GetDirectoryEntry().Properties["gPhotoID"]);
// OFFENDING LINE!
Well, there are two problems here:

1) The "searcher.FindAll()" call could possibly return no results, if
your filter doesn't match any records - so blindly using "results[0]"
will cause an exception when no result has been returned

2) Along similar lines - even if you have one or multiple results
returned, those possibly will not contain any value in "gPhotoID"
(because the path has not been set), and then using that (by casting
it to a string) will also cause an exception.

Furthermore - if you want to access just a single property (or a few)
on the search result, your best bet is to specify those properties on
the searcher object itself and query them from the result directly
(without having to retrieve the full "DirectoryEntry" object and
access them there).

So your search should look something like this:

searcher.Filter = "(uid=wsmith)";
// specify which properties to load directly into the result
searcher.PropertiesToLoad.Add("gPhotoID");

SearchResultCollection results = searcher.FindAll();

// check to see if we have any results !
if(results.Count 0)
{
SearchResult firstResult = results[0];

// check to see if result contains a value for the property
if(firstResult.Properties.Contains["gPhotoID"])
{
// the result's property might be a multi-value
// string property, so pick string [0] from the
// collection
string photoID =
firstResult.Properties["gPhotoID"][0].ToString();
}
}

HTH
Marc
Nov 16 '06 #2
Thanks for your reply. I know that it's possible to not get any results
back from searcher.FindAll(), but I was trying to show the smallest
possible example. I have tried using the ProperitesToLoad.Add() and
when I do even the properties I don't specify are actually accessible.
Do you know why this would happen? I'll try it again specifying every
property I would like to load, and checking for multiple values for
each property. I just don't understand why that specific property
throws an exception when none of the others do. Could it be the format
that the string is in (in the format for a url?)? Would the length have
to do with it (the length of that property for myself in the directory
is 58 characters)? And what exactly does that exception mean?

Thanks for your help Marc,
Will

Marc Scheuner wrote:
example("ldap.example.com", "ou=People,dc=example,dc=com");

public void example(string server, string ou) {
searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + server
+ "/" + ou, "", "", AuthenticationTypes.ReadonlyServer));

searcher.Filter = "(uid=wsmith)";
SearchResultCollection results = searcher.FindAll();
Console.WriteLine((string)results[0].GetDirectoryEntry().Properties["gPhotoID"]);
// OFFENDING LINE!

Well, there are two problems here:

1) The "searcher.FindAll()" call could possibly return no results, if
your filter doesn't match any records - so blindly using "results[0]"
will cause an exception when no result has been returned

2) Along similar lines - even if you have one or multiple results
returned, those possibly will not contain any value in "gPhotoID"
(because the path has not been set), and then using that (by casting
it to a string) will also cause an exception.

Furthermore - if you want to access just a single property (or a few)
on the search result, your best bet is to specify those properties on
the searcher object itself and query them from the result directly
(without having to retrieve the full "DirectoryEntry" object and
access them there).

So your search should look something like this:

searcher.Filter = "(uid=wsmith)";
// specify which properties to load directly into the result
searcher.PropertiesToLoad.Add("gPhotoID");

SearchResultCollection results = searcher.FindAll();

// check to see if we have any results !
if(results.Count 0)
{
SearchResult firstResult = results[0];

// check to see if result contains a value for the property
if(firstResult.Properties.Contains["gPhotoID"])
{
// the result's property might be a multi-value
// string property, so pick string [0] from the
// collection
string photoID =
firstResult.Properties["gPhotoID"][0].ToString();
}
}

HTH
Marc
Nov 16 '06 #3
Ok so I tried it again with specifying each property before performing
the search, and checking for multiple results as specified before. I
still get the same exception. I've tried accessing other properties
that are available, but I don't need and I can seem to access those
just fine, but every time I get to this one it throws an exception. Any
Ideas??

Thanks,
Will

bugnthecode wrote:
Thanks for your reply. I know that it's possible to not get any results
back from searcher.FindAll(), but I was trying to show the smallest
possible example. I have tried using the ProperitesToLoad.Add() and
when I do even the properties I don't specify are actually accessible.
Do you know why this would happen? I'll try it again specifying every
property I would like to load, and checking for multiple values for
each property. I just don't understand why that specific property
throws an exception when none of the others do. Could it be the format
that the string is in (in the format for a url?)? Would the length have
to do with it (the length of that property for myself in the directory
is 58 characters)? And what exactly does that exception mean?

Thanks for your help Marc,
Will
Nov 16 '06 #4
>Ok so I tried it again with specifying each property before performing
>the search, and checking for multiple results as specified before. I
still get the same exception. I've tried accessing other properties
that are available, but I don't need and I can seem to access those
just fine, but every time I get to this one it throws an exception. Any
Ideas??
Are you still using the ".GetDirectoryEntry()" call?? This will return
the complete DirectoryEntry for the search result - that will
obviuosly have all the properties available !

Marc
Nov 17 '06 #5
Have you seen this posting: "Errors Reading IBM ITIM LDAP properties"
in microsoft.public.adsi.general ? It doesn't exactly apply to your
situation as it's about non-AD LDAP directories but maybe gPhoto*ID is
as poorly handled by the ADSi-.NET conversion as non-AD attributes?

SSG

Nov 22 '06 #6

bugnthecode wrote:
Hi, I'm building a small desktop app in VS Std 2005 with C# and .net
2.0. I've managed to get the code together to query the ldap my company
has, but every time I attempt to access a specific property a COM
Exception gets thrown, and I can't figure out why. This is a desktop
app.

example("ldap.example.com", "ou=People,dc=example,dc=com");

public void example(string server, string ou) {
searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + server
+ "/" + ou, "", "", AuthenticationTypes.ReadonlyServer));

searcher.Filter = "(uid=wsmith)";
SearchResultCollection results = searcher.FindAll();
Console.WriteLine((string)results[0].GetDirectoryEntry().Properties["gPhotoID"]);
// OFFENDING LINE!
}

So that's pretty much the smallest bit of code I can use and get the
error. All the other properties I've tried to access so far have worked
just fine, I've even found some properties to be a collection of values
which works just fine. The gPhotoID should contain a url to a picture
which would look like
"http://intranet.example.com/employees/pictures/18273010.JPG".

The error that I'm getting is:
System.Runtime.InteropServices.COMException was unhandled
Message="Unknown error (0x8000500c)"
Source="System.DirectoryServices"
ErrorCode=-2147463156
StackTrace:
at
System.DirectoryServices.PropertyValueCollection.P opulateList()
at
System.DirectoryServices.PropertyValueCollection.. ctor(DirectoryEntry
entry, String propertyName)
at
System.DirectoryServices.PropertyCollection.Proper tyEnumerator.get_Entry()
at
System.DirectoryServices.PropertyCollection.Proper tyEnumerator.get_Current()
at UserManager.UserFactory.Find(String criteria) in D:\My
Documents\Visual Studio
2005\Projects\UserManager\UserManager\UserFactory. cs:line 58
at UserManager.UserFactory.FindByUnix(String unix) in D:\My
Documents\Visual Studio
2005\Projects\UserManager\UserManager\UserFactory. cs:line 26
at UserManagerTest.Program.Main(String[] args) in D:\My
Documents\Visual Studio
2005\Projects\UserManagerTest\UserManagerTest\Prog ram.cs:line 10
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[]
args)
at System.AppDomain.ExecuteAssembly(String assemblyFile,
Evidence assemblySecurity, String[] args)
at
Microsoft.VisualStudio.HostingProcess.HostProc.Run UsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context( Object
state)
at System.Threading.ExecutionContext.Run(ExecutionCon text
executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

I can't seem to find a solution. I've been googling for over an hour,
and most of the answers I find pertain to credential issues, and
asp.net issues. Can someone please offer assistance?

Thanks,
Will
I'm getting the exact same problem. I can read all properties in the
entire directory except for two specific ones which coincidentally were
only recently added to the schema. For those two properties I can't
even enumerate them my loop. As soon as the loop steps to those
properties, boom. Still investigating.

Dec 1 '06 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: kovac | last post by:
The System.directoryservices.dll has an error, and this error was described in http://support.microsoft.com/default.aspx?scid=kb;en-us;839424 At the moment we have Framework version v1.0.3705 and...
12
by: hykim | last post by:
Hello, everyone. according to MSDN, there is any constructor of System.DirectoryServices.SearchResultCollection Class. if I implement DirectorySearcher.FindAll() method by myself, then how can I...
1
by: Jason Gleason | last post by:
I am using the following method in a web service that utilizes the system.directoryservices namespace: public ArrayList GetAllAppPools(){ System.DirectoryServices.DirectoryEntry apppools = new...
1
by: Enosh Chang | last post by:
Hi all, I encounter some problem in DirectoryServices, could someone help me? private void InitLoginUser() { DirectoryEntry objEntry = new DirectoryEntry(); DirectorySearcher objSearcher =...
0
by: Chris Frohlich | last post by:
All, I've built an Employee Directory with ASP.NET app that queries Active Directory for users and builds links with the results. What I'm seeing is really intermittent failures to bind to the...
9
by: Günther Rühmann | last post by:
Hi, I´m not sure if i´m right int this group... My problem: I made a vb .net application that reads from AD via System.Directoryservices.Directoryentry. The appliocation enumerates group...
2
by: Kelvin | last post by:
Hello I am using web matrix develop a login page through Active Directory but I cannot figure out why it is giving me an error when importing system.directoryServices. Any help will do! thank ...
5
by: Keith Jakobs, MCP | last post by:
Hi All.... I'm having a HECK of a time connecting to Active Directory using VB in Visual Studio.NET 2003. Can anyone PLEASE help me? All I am trying to do is list the current members of our...
7
by: turbon | last post by:
Hello, I am writing code, which will copy webServices from one IIS 6.0 webserver to another and using DirentoryServices to achieve this purpose. And I have problems with authentication - I get an...
7
by: =?Utf-8?B?SmVycnkgQw==?= | last post by:
I am using this code to get groups for a user and getting a error (5) on the GetAuthorizationGroups() function . There are two domains. This function works on the local domain but does not work...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.