Pagina 1 van 1

User Object maken in AD via ASP (VB)

Geplaatst: 09 jan 2006, 17:01
door meon
Wat ik wil doen is vanuit een ASP-pagina een user-object maken in de Active Directory, gebruik makend van impersonation.

Hoe ik een object kan wijzigen op die manier heb ik gevonden, maar het aanmaken ervan niet.
Het probleem is denk ik ook dat ik nergens fatsoenlijke naslag vind over de methods, properties enz van die objecten.

Ter info: Ik heb nog geen enkele code uitgevoerd, ik zit niet in een testomgeving.

Code: Selecteer alles

Function CreateUser(username,company,password) 
   strUserDN = "CN=superuser,OU=ServiceAccounts,DC=corp,DC=local"
   strPassword = "P@ssw0rd"
   
   Set objOU = GetObject("LDAP://OU=test, DC=corp, DC=local")
    Set objUser = objOU.Create ("User", "cn=" & username, strUserDN, strPassword, ADS_SECURE_AUTHENTICATION)
    objUser.sAMAccountName = username
    objUser.GivenName = username
   objUser.Company = company
    objUser.AccountDisabled = FALSE
    objUser.SetPassword password
   objUser.SetInfo

End Function


Maw, kunnen die parameters voor .Create in dat object?

Geplaatst: 09 jan 2006, 20:58
door meon
Wat testen verraadt hetvolgende: bij de .Create kan ik dus niet die impersonisation gebruiken, en zonder krijg ik:

Code: Selecteer alles

Active Directory error '80070005' 

Algemene toegangsfout

/_layouts/WebApps/UserCreation/functions.inc.asp, line 40

Geplaatst: 09 jan 2006, 21:44
door khsw
Dat lijkt me inderdaad een security error.

't Is héél lang geleden, maar misschien kan je in VB6 een ActiveX DLL maken die je laat draaien onder Component Services (COM+). Dan kan je kiezen onder welke account deze draait (dus de impersonation die je wenst), zonder dat je de account onder wie het ASP proces draait rechten op AD dient te geven.

Geplaatst: 10 jan 2006, 09:23
door meon
Euhm... daar ben je me kwijt :-)

Maar uiteindelijk lukt me vrijwel alles, behalve ... een paswoord zetten.

Van het moment dat ik iets doe als

Code: Selecteer alles

objUser.SetPassword "123456"
dan gaat het mis met bovenstaande error.

Mag ik er op wijzen dat ik bij wijze van spreken in notepad bezig ben en dus geen Visual Studio heb ;)

Geplaatst: 10 jan 2006, 09:43
door khsw
Ah, Notepad, mijn all-time favorite editor :lol:

Voor SetPassword heb je administrator rechten nodig denk ik. En de account waaronder IIS draait admin rechten geven lijkt me niet direct de meest aangewezen oplossing...

Geplaatst: 10 jan 2006, 10:13
door meon
Het is PrimalScript actually, beetje color-coding en code hinting is soms wel handig ;)

Maar ik open de het OU-object als een Domain Admin, ik krijg users gemaakt, waarom zou het wachtwoord setten dan problemen geven :(

Ik heb niet geprobeerd door dezelfde pagina vanop de domain controller zelf eens op te vragen als administrator, misschien dat dat een ander resultaat geeft ...

Is hier trouwens ergens fatsoenlijke naslag van? Van welke methods op objecten gecreëerd uit AD-objecten kunnen enz?

Geplaatst: 10 jan 2006, 10:32
door khsw
Op de weinig overzichtelijke MSDN site kan je het één en ander vinden...
http://msdn.microsoft.com/library/defau ... g_adsi.asp

Ik zou eens proberen om Anonymous Access af te zetten zodat IIS de credentials gebruikt van de aangelogde user. Wanneer je dan voldoende rechten hebt, zou het toch moeten lukken?

Geplaatst: 10 jan 2006, 10:38
door wem
khsw schreef:Ik zou eens proberen om Anonymous Access af te zetten zodat IIS de credentials gebruikt van de aangelogde user.


draait IIS niet als service? Zo ja, dan draait deze al als er nog geen "aangelogde user" is, dus kan deze ook niet de rechten van een "aangelogde gebruiker" hebben.

Geplaatst: 10 jan 2006, 11:24
door khsw
wem schreef:
khsw schreef:Ik zou eens proberen om Anonymous Access af te zetten zodat IIS de credentials gebruikt van de aangelogde user.


draait IIS niet als service? Zo ja, dan draait deze al als er nog geen "aangelogde user" is, dus kan deze ook niet de rechten van een "aangelogde gebruiker" hebben.


IIS kan echter gebruik maken van Impersonation. Elke sessie draait in een eigen securitycontext.

Stel dat je anonymous access aan hebt staan op de server en je probeert naar een directory te browsen (die uiteraard bereikbaar is via IIS) die beveiligd is. Op dat moment zal IIS je toch ook komen vragen om je username en password en zal dan met die gegevens opnieuw proberen om de directory te accessen...

Geplaatst: 10 jan 2006, 13:51
door meon
Weer meer info:
Als ik de pagina opvraag als onbekende user krijg ik fout nummer 80070005
Als ik als Domain Admin de pagina opvraag krijg ik fout nummer 80005008
Beiden met de tekst: One or more input parameters are invalid

Geplaatst: 16 feb 2006, 14:53
door meon
Ik ben er nog steeds niet uit. Ik heb de code eens uit de ASP-pagina getrokken en voer hem rechtstreeks op de server uit als VBS

Dit gebeurt er:
User 1 wordt gemaakt
User 1 wordt geënabled (+pass geset)
User 2 wordt gemaakt
User 2 enablen loopt fout: Active Directory Error 80005008 (zoals bovenstaande) op de .SetPassword .

Maw, 1x loopt het goed, 2e keer niet. Wie heeft een reden/oplossing?

Code: Selecteer alles

company = InputBox("company")
prefix = InputBox("prefix")
numberusers = InputBox("number of users")
startat = InputBox("Start at")


   For i = startat to (numberusers+startat)       username = LCase(prefix) & Cstr(i)
      password = generatePassword(8)
   
      return = CreateUser (username,company)
      Call EnableUser(return,password)   
   next
'Defineer constanten

Const ADS_UC_SUPERUSER = "CN=Administrator,OU=Users,DC=extranet,DC=local"
Const ADS_UC_SUPERUSER_PWD = "P@ssw0rd"
Const ADS_UC_TARGET_OU = "OU=CustAccounts,OU=Extranet,DC=extranet,DC=local"


Function generatePassword(passwordLength)
   Chars="abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789"
   Randomize
   lenChars = len(Chars)
   For iCounter = 1 To passwordLength
      iChar = Int((lenChars * Rnd) + 1)
      tmpPass = tmpPass & Mid(Chars,iChar,1)
   Next
   generatePassword = tmpPass
End Function

Function CreateUser(username,company)
      
   Set objRoot = GetObject("LDAP:")
   Set objOU = objRoot.OpenDSObject("LDAP://"& ADS_UC_TARGET_OU, ADS_UC_SUPERUSER, ADS_UC_SUPERUSER_PWD, ADS_SECURE_AUTHENTICATION)
   
   Set objUser = objOU.Create ("User", "cn=" & username)
   objUser.sAMAccountName = username
   objUser.Put "userPrincipalName", username + "@extranet.local"
   objUser.Put "displayName", username
   objUser.Put "Company", Cstr(company)
   objUser.SetInfo
   
   Set objUser = Nothing
   Set objOU = Nothing
   Set objRoot = Nothing
   
   CreateUser = "LDAP://CN="& username &",OU=CustAccounts,OU=Extranet,DC=extranet,DC=local"
   
End Function

Sub EnableUser(strADsPath, wachtwoord)
   Set objRoot = GetObject("LDAP:")
   Set objUser = objRoot.OpenDSObject(strADsPath,ADS_UC_SUPERUSER,ADS_UC_SUPERUSER_PWD,ADS_SECURE_AUTHENTICATION)

   objUser.SetPassword wachtwoord
   objUser.AccountDisabled = False
   objUser.Put "userAccountControl", 66048

   objUser.SetInfo

   Set objRoot = Nothing   
   Set objUser = Nothing
   
End Sub

Geplaatst: 17 feb 2006, 11:45
door meon
Ik heb een oplossing gevonden!

In EnableUser het LDAP-pad niet ophalen via het root-object en OpenDSObject, maar gewoon rechtstreeks via GetObject . Nadeel: geen impersonating meer mogelijk ...

Het lijkt er op dat de constanten niet zo constant zijn ...

Geplaatst: 17 feb 2006, 12:13
door BungaMan
Is het wel een valid paswoord voor user2? Als er bv regels ingesteld zijn zoals min 8 karakters, 1 hoofdletter, ...

Een beetje gegoogled en die error zou toch moeten betekenen dat het paswoord niet geldig is of een of andere parameter.

Geplaatst: 17 feb 2006, 12:19
door meon
De paswoorden zijn oké.

In een ASP-pagina kan ik geen GetObject gebruiken ... grr... terug naar af. :(