Hej Det jag funderar på är att asp.exe kanske inte har rättigheter att kalla/köra din dll. Du säger att den fungerar i asp.net, det tyder nämligen på att rättigheterna är ok. Jo tänkte på det oxå Du får nog rikta in dig på två steg. 1 att asp får göra anropet. 2. att dll:en får kalla på ad:t. Eftersom en surfare alltid är guest som kallar på hela ledet här så måste mer rättigheter till på din komponent tror jag. Lägg till lite mer felhantering i din komponent så du får bättre svar också eller låt den logga ner till något. Eller hooka på vs.net debugging på din funktion så du ser vart det smäller. Hej igen.Net DirectoryServices komponent i ASP 3 - error
Jag har gjort en komponent i C# .Net som läser av AD:t.
Jag har reggat dem i GACen och skapat en tlb och reggat den med RegAsm.
Den skall alltså användas på en vanlig ASP-sida. Men se, det vill sig icke.
Här är delar av ASP-koden (JScript)
var sLoginName = new String(Request("LOGON_USER"))
sNTLogin = sLoginName.split("\\")
sNTLogin = sNTLogin[ sNTLogin.length - 1 ]
Response.Write( sNTLogin + '<br>\n' )
oLDAP = Server.CreateObject("SiteBase.AD.ADBrowser");
Response.Write( oLDAP + '<br>\n' )
Session("adminID") = oLDAP.GetGUID(sNTLogin)
På sista raden kraschar det. Meddelande:
System.DirectoryServices error '80072020'
An operations error occurred
Om jag gör en ASP.NET-sida som gör samma sak funkar det. Är det något särskilt man måste tänka på när man gör anrop mot DirectoryServices i form av ett COM-Object??
Se här nedan de relevanta delarna av komponenten
Tacksam för all hjälp
/Staffan
[ClassInterfaceAttribute( ClassInterfaceType.AutoDual)]
public class ADBrowser
{
/// <summary>
/// enumeration for internal use
/// </summary>
enum ADtype
{
user=1,
group
}
private string RootDseNamingContext = null;
/// <summary>
/// <para>No parameters, suitable for COM.</para>
/// </summary>
public ADBrowser()
{
DirectoryEntry de = new System.DirectoryServices.DirectoryEntry( "LDAP://RootDSE" );
if( de.Properties["defaultNamingContext"][0] != null )
this.RootDseNamingContext = de.Properties["defaultNamingContext"][0].ToString();
}
/// <summary>
/// <para>Get the GUID string for a person in {a0a7e1f2-0c3b-42cd-9d1b-7ea97ec2299b} - format</para>
/// </summary>
/// <param name="loginid">NT login name for the person</param>
/// <returns>A string with the GUID or null if failure</returns>
public string GetGUID( string loginid )
{
DirectoryEntry myDE = this.GetDE();
if( myDE == null )
return null;
DirectorySearcher mySearcher = new DirectorySearcher(myDE);
string filter = "(&(ObjectCategory=User)(sAMAccountName="
+ loginid + "))";
mySearcher.Filter = filter;
mySearcher.SearchScope = SearchScope.Subtree;
SearchResult result = mySearcher.FindOne();
if( result == null )
return null;
DirectoryEntry de = result.GetDirectoryEntry();
return result.GetDirectoryEntry().Guid.ToString( "B" );
}
/// <summary>
/// <para>Get the root <see cref="System.DirectoryServices.DirectoryEntry"/> of the AD</para>
/// </summary>
/// <returns><see cref="System.DirectoryServices.DirectoryEntry"/></returns>
private DirectoryEntry GetDE()
{
if( RootDseNamingContext != null )
return new System.DirectoryServices.DirectoryEntry( "LDAP://" + RootDseNamingContext );
else
return null;
}
}
}
Sv: .Net DirectoryServices komponent i ASP 3 - error
Sv:.Net DirectoryServices komponent i ASP 3 - error
men dessa rader funkar bra.
oLDAP = Server.CreateObject("SiteBase.AD.ADBrowser");
Response.Write( oLDAP + '<br>\n' )
Dessutom har jag idag testat vidare en smula och funnit
om jag loggar in på servern, med lokal admin behörighet, och startar IE där så funkar det.
Men ligger jag på samma nätverk (med samma identitet som jag loggar på med ovan ) på en annan maskin så ballar det ur.
så VAR sätter jag rättigheter för en besökare (vanlig domän User i domänen i fråga ) på servern
att läsa AD:t?
Sv: .Net DirectoryServices komponent i ASP 3 - error
Sv: .Net DirectoryServices komponent i ASP 3 - error
Tack för dina tips Pelle
Nu har hunnit testa vidare och funnit en halv lösning
När jag skapar ett DirectoryEntry för sökning görs detta i min funktion GetDE().
Om jag där använder loginuppgifter (vilket jag inte gjort tidigare) för en vanlig domänanvändare så, YES, funkar det klockrent även i gamla ASP 3.
Slutledning & Ny fråga
.NET komponent som körs som COM får inte med sig några loginuppgifter när den skall göra uppslag i AD:t via System.DirectoryServices.
I ASP.NET klarar man det med Impersonation men hur löser man detsamma i ASP?
Och ja, jag har på IIS:en angett Ingen anonymn besökare, Windows-login - så webbanvändaren är en domänanvändare.
Kan man komma runt/lösa detta?
Det vore kul & slippa ha en dummy-användare i AD:t bara för detta.
Har någon stött på detta & kan ge tips eller länk till ngn artikel vore jag tacksam.
Nu ser ASP-koden ut som följer:
if(Request("LOGON_USER") == "")
{
Response.Status = "401 Access Denied"
Response.End
}
sNTLogin = sLoginName.split("\\");
sNTLogin = sNTLogin[ sNTLogin.length - 1 ];
// funkar
oLDAP = Server.CreateObject("SiteBase.AD.ADBrowser");
// ange en domänanvändare
oLDAP.ADUser = "Staffan Sjöstedt";
oLDAP.ADUserPasswd = "<sssshh>";
// funkar
Response.Write( oLDAP.RootDseNamingContext + '<br>\n' )
// ger inget resultat om man inte anger en domänanvändare ovan
// se C#-koden nedan
var adminID = oLDAP.GetGUID(sNTLogin);
DVS
1) jag kan skapa en instans av objektet.
2) I konstruktorn görs ett uppslag i AD för att finna RootDSE.
DirectoryEntry de = new System.DirectoryServices.DirectoryEntry( "LDAP://RootDSE" ); )
Detta funkar och kan läsas i propertyn "RootDseNamingContext"
Men när ett uppslag skall göras för att ta fram en DirectoryEntry utfrån ett NTlogin så ger sökningen ett fel.
public string GetGUID( string loginid )
{
DirectoryEntry myDE = this.GetDE();
if( myDE == null )
return null;
DirectorySearcher mySearcher = new DirectorySearcher(myDE);
string filter = "(&(ObjectCategory=User)(sAMAccountName="
+ loginid + "))";
mySearcher.Filter = filter;
mySearcher.SearchScope = SearchScope.Subtree;
SearchResult result = null;
try
{
result = mySearcher.FindOne();
}
catch( Exception e )
{
this.lastError = "GetGUID( " + loginid + " ); Error in FindOne(). Message: " + e.Message;
if( e.InnerException != null )
this.lastError += Environment.NewLine + "InnerException=" + e.InnerException.Message;
return null;
}
if( result == null )
{
this.lastError = "GetGUID( " + loginid + " ); FindOne() returned null";
return null;
}
DirectoryEntry de = result.GetDirectoryEntry();
this.adUser = de.Username;
return de.Guid.ToString( "B" );
}
private DirectoryEntry GetDE()
{
if( rootDseNamingContext != null )
{
// skicka med loginuppgifter - tillägg efter div tester. Detta löser problemet i ASP 3
// men kan man undvika detta???
if( ( this.adUser != null ) && ( this.adUserPasswd != null ) )
return new System.DirectoryServices.DirectoryEntry( "LDAP://" + rootDseNamingContext,
this.adUser,
this.adUserPasswd,
AuthenticationTypes.ReadonlyServer );
else // inga loginuppgifter krävs
return new System.DirectoryServices.DirectoryEntry( "LDAP://" + rootDseNamingContext );
}
else
return null;
}
Det enda felmeddelande jag får ut är fortfarande: "An operations error occurred."
Felet kastas vid anropet till DirectorySearcher.FindOne().
Detta sker även om besökaren är DomänAdmin.
MEN
om man som sagt kör webbläsaren på servern med en användare som har lokala adminrättigheter på den kärran - så funkar det.
/Staffan