[VBScript] User Object binden

Pagina: 1
Acties:
  • 208 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Godjira
  • Registratie: Februari 2003
  • Laatst online: 10-08 02:06

Godjira

To infinity and beyond!

Topicstarter
Ik ben druk bezig met het maken van een loginscript in VBScript. Hierin worden meerdere drivemapping gemaakt, etc.

Voor bepaalde functies heb ik een verbinding nodig naar het User Object. Deze connect ik op de volgende manier:
code:
1
Set oUser   = GetObject("WinNT://" & sAdsPathUser & ",user")


Helaas levert dit soms (vooral bij netwerkdrukte) nog weleens een fout op. De fout is dan "The network path was not found". Nou heb ik hiervoor een functie geschreven, om te zorgen dat gebruikers deze foutmelding niet te zien krijgen, maar het script gewoon stopt, namelijk onderstaande:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function oUser()
    On Error Resume Next
    Dim iRetry
    LogFile = "loginerrors.log"
    iRetry = 0
    Set oUser = GetObject("WinNT://" & sAdsPathUser & ",user")
    Do While Err.Number <> 0
        Err.Clear
        Set oUser = GetObject("WinNT://" & sAdsPathUser & ",user")
        iRetry = iRetry + 1
        If iRetry = 50 Then
            WriteLog sAdsPathUser & " | " & "Reached 50 reties on the oUser function. Script has exited!"
            Err.Clear
            WScript.Quit
        End If
        Err.Clear
    Loop
End Function


Na veel zoekwerk op Google en de MSDN pagina's van Microsoft blijkt deze functie de beste oplossing. Echter, ik vind deze oplossing niet de mooiste. Het zou niet nodig moeten zijn om een dergelijke functie te schrijven.

Tijdens mijn zoektochten heb ik op veel pagina's met script voorbeelden gezien dat heel veel mensen op deze manier het User Object benaderen, dus het moet haast wel ergens anders liggen (buiten een scriptfout)

Het script werkt met deze functie naar behoren en vaak komt de fout niet voor, maar ik ben toch benieuwd of iemand van jullie mij kan helpen in deze. Wellicht het aanpassen van instellingen (ik denk daarbij aan een time-out setting) in de Active Directory of een aanpassing aan het script.

Enkele oplossingen die ik gevonden heb leken te werken, waaronder andere manieren van error handling. Niets kwam in de buurt van de oplossing die ik heb gevonden, helaas. Maar ondanks deze oplossing zie ik liever dat het altijd goed zal werken zonder deze functie.

Heeft iemand ideën?

Profile


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Het probleem waar je tegen loopt is het feit dat VBScript eigenlijk niets kan. VBScript kent een paar simpele functies en de rest komt uit (ActiveX) objecten. Ook het benaderen van active directory of IIS werkt door middel van objecten. Omdat het laden van een object normaal geen timeout kan opleveren (denk aan GetObject("Adodb.RecordSet") statements). IIS en AD objecten zijn er een beetje ingevrommeld om het zo maar te zeggen.

Er zit dus niets anders op om door middel van een functie het object op te halen. Wel zou je een generieke functie kunnen schrijven waaraan je het path en het aantal pogingen opgeeft. Deze functie rerouteerd dan uiteindelijk het object of nothing (mislukt).

Een andere oplossing is je toevlucht zoeken in VB.NET. Via de System.DirectoryServices namespace heb je dan een zeer goede controle over je programma. Ook kent VB.net een betere fout afhandeling.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Brahiewahiewa
  • Registratie: Oktober 2001
  • Laatst online: 30-09-2022

Brahiewahiewa

boelkloedig

Je gebruikt nu WinNT om je object te creëren. Da's ouderwets. Bovendien moet de client daarvoor de PDC emulator raadplegen en dat is performancegewijs niet handig (zoals je zelf dus ook al gemerkt hebt). Probeer het eens met
Visual Basic:
1
Set objUser = GetObject ("LDAP://cn=<username>,ou=<user's OU,dc=<2nd level domain>,dc=<1st level domain>,dc=<tld>")
of kijk op http://www.microsoft.com/...ers/default.mspx?mfr=true voor meer voorbeelden

QnJhaGlld2FoaWV3YQ==


Acties:
  • 0 Henk 'm!

  • Godjira
  • Registratie: Februari 2003
  • Laatst online: 10-08 02:06

Godjira

To infinity and beyond!

Topicstarter
Brahiewahiewa schreef op dinsdag 18 september 2007 @ 19:03:
Je gebruikt nu WinNT om je object te creëren. Da's ouderwets. Bovendien moet de client daarvoor de PDC emulator raadplegen en dat is performancegewijs niet handig (zoals je zelf dus ook al gemerkt hebt). Probeer het eens met
Visual Basic:
1
Set objUser = GetObject ("LDAP://cn=<username>,ou=<user's OU,dc=<2nd level domain>,dc=<1st level domain>,dc=<tld>")
of kijk op http://www.microsoft.com/...ers/default.mspx?mfr=true voor meer voorbeelden
Bedankt voor deze informatie. Ik heb dit al eens geprobeerd en kreeg niet het gewenste resultaat, maar ik ga het toch nogmaals eens proberen (volgens mij was mijn LDAP regel ook niet gelijk hieraan).

Ik laat de resultaten nog weten. Morgen ben ik weer in staat om hieraan te knutselen.

Profile


  • Godjira
  • Registratie: Februari 2003
  • Laatst online: 10-08 02:06

Godjira

To infinity and beyond!

Topicstarter
Ik heb het aan de praat gekregen op deze wijze:

code:
1
2
3
Public oSysInfo : Set oSysInfo = CreateObject("ADSystemInfo")
sAdsPathUser = oSysInfo.UserName
Set oUser = GetObject("LDAP://" & sAdsPathUser)


Om dit in gebruik te nemen heb ik enkele andere functies ook moeten herschrijven, zoals de IsMember functie om te controleren of de gebruiker lid is van de opgegeven groep. Alles ziet er goed uit en alles lijkt ook goed te functioneren. De eerdere fouten (welke maar af en toe voorkwamen) lijken geheel te zijn verdwenen.

Profile