Jump to content

P.Foeckeler

Members
  • Gesamte Inhalte

    117
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von P.Foeckeler

  1. Hallo,

     

    noch eine kurze Frage zum Schluß: Bei Deinem allerersten Versuch mit dem VBScript, was hat denn da genau nicht funktioniert als Du einen anderen User verwenden wolltest? Interessiert mich brennend, da ich der Autor von dem SelfADSI-Tutorial bin, aus dem das Beispiel entnommen wurde...

     

    Eigentlich muss das nämlich sehr wohl funktionieren. Kannst Du velleicht den VBScript-Errorcode posten, der dabei auftritt???

     

    Danke und Gruß,

    Philipp

  2. Hallo,

     

    ist der Benutzer, bei dem die Rechte verschwinden, vielleicht in einer der vordefinierten Gruppen "Domänen Admins", "Account Operatoren", "Server Operatoren" oder "Adminiistratoren"? Oder war er es einmal in der Vergangenheit...dann wird nämlich regelmäßig ca. einmal in der Stunde seine ACL durch die des adminSDHolder-Objektes ersetzt! Schau mal hier nach:

     

    The "Send As" right is removed from a user object after you configure the "Send As" right in the Active Directory Users and Computers snap-in in Exchange Server

     

    Gruß,

    Philipp

  3. Hallo,

     

    also dieser Effekt tritt oft dann auf, wenn mit der DNS-Auflösung des Fileservers (welches System mit SAN-Storage das dann auch immer sein sollte) nicht richtig konfiguriert ist, z.B. wenn es von dort aus kein Reverse Lookup gibt auf die IP-Adressen der DCs...

     

    Überprüf bitte, ob das FileServer-System von seinem TCP/IP-Einstellungen direkt diejenigen DNS-Server verwendet, in denen sich die SRV-Records der AD-DCs befinden, und dass die DCs reverse auflösbar sind.

     

    nslookup <ip-addresse-eines-dcs>

     

     

    Gruß,

    Philipp

  4. Ich nochmal:

     

    ...oder entsprechend als Array, außerdem habe ich noch ein paar LCase Aufrufe für Groß-/KleinSchreibung eingefügt...

     

    On Error Resume Next
    
    Set objSysInfo = CreateObject("ADSystemInfo")
    Set objNetwork = CreateObject("Wscript.Network")
    strUserPath = LCase(objSysInfo.UserName)
    
    OU = Array( _
    "ou=data,dc=example,dc=com", _
    "ou=unterOU1,ou=data,dc=example,dc=com", _
    "ou=unterOU2,ou=data,dc=example,dc=com", _
    "ou=benutzer,dc=example,dc=com" )
    
    SHARE = Array( _
    "\\server\OUs\ou1", _
    "\\server\OUs\ou2", _
    "\\server\OUs\ou3", _
    "\\server\OUs\ou4" )
    
    
    for i = o to UBound(OU)
           if (InStr(strUserPath , OU(i)) > 0 ) then
                   objNetwork.MapNetworkDrive "S:", SHARE(i)
           End if
    next

     

    Gruß,

    Philipp

  5. Hallo, also du machst ja folgendes mit deinem Script:

    • Die Gruppen des aktuellen Benutzers rausfinden
    • Je nach Gruppe ein Laufwerk setzen

     

    So, und wenn Du das jetzt mit dem Kriterium "je-nachdem-in-welcher-OU-der USer ist", dann ist das ja keine Frage von 100en OUs (ein Benutzer kann ja nur in einer OU sein, na und dann noch logisch gesehen in den darüber liegenden, je nachdem wie man's sieht.....

     

    Also dann müßte das ungefähr so aussehen. Ein "Select Case" kann man nicht machen, sondern muss irgendwie mit der InStr Funktion rumspielen, von wegen "Wenn im LDAP-Pfad des Benutzers der LDAP-Pfad einer OU enthalten ist, dann folgende Gruppenmitgliedschaft" ....

     

    Infos zum LDAP PFad: SelfADSI : LDAP-Pfadnamen und Distinguished Names

     

    On Error Resume Next
    
    Set objSysInfo = CreateObject("ADSystemInfo")
    Set objNetwork = CreateObject("Wscript.Network")
    strUserPath = "LDAP://" & objSysInfo.UserName
    
    ou1 = "ou=data,dc=example,dc=com"
    ou2 = "ou=unterOU1,ou=data,dc=example,dc=com"
    ou3 = "ou=unterOU2,ou=data,dc=example,dc=com"
    ou4 = "ou=benutzer,dc=example,dc=com"
    '.....usw usw
    
    if (InStr(strUserPath , ou1) > 0 ) then
           objNetwork.MapNetworkDrive "S:", "\\server\OUs\ou1"
    End if
    
    if (InStr(strUserPath , ou2) > 0 ) then
           objNetwork.MapNetworkDrive "S:", "\\server\OUs\ou2"
    end if
    
    if (InStr(strUserPath , ou3) > 0 ) then
           objNetwork.MapNetworkDrive "S:", "\\server\OUs\ou3"
    end if
    
    if (InStr(strUserPath , ou4) > 0 ) then
           objNetwork.MapNetworkDrive "S:", "\\server\OUs\ou4"
    end if
    
    '....usw usw
    end if

     

    Gruß,

    Philipp

  6. Hallihallo,

     

    also meiner Erfahrung nach ist dies ein Problem mit dem TCP/IP-Stack, bzw. mit dem darunter liegenden Netzwerkkartentreiber. Ich bin dem schon begegnet in Fällen, in dem der NIC-Treiber wegn Negotiation (das alte Lied) noch nicht fertig initialisiert hatte, aber der DNS-Resolver bzw. der NetLogon-Dienst (der ist auf DCs zuständig) bereits sein dynamisches Update machen will... oder der Treiber hat insgesamt einen Schaden, schau mal hier nach einem Update beim Hersteller. Vielleicht ist evtl. ein Teaming (falsch) konfiguriert? Typisch wäre in diesen Fällen, dass dieser Fehler nur beim Booten der Maschine kommt.

     

    Oder kommt der Fehler permanent? (d.h. jedesmal wenn du IPCONFIG /registerdns ausführst)? In diesem Fall hilft relativ schnell ein Trace mit WireShark oder Ähnlichem, die DNS-ReRegister-Anfragen sind alle im Klartext und man sieht sehr gut was er machen will und nicht kann... :)

     

    Gruß,

    Philipp

  7. Hallo,

     

    bit Du Dir sicher, dass Du Deine Personalnummern in das employeeType Attribut schreiben willst? Es gbit nämlich auch noch employeeID und employeeNumber, also von weitem hören die sich irgendwie passender an...:wink2:

     

    Hier ist außerdem noch das ganze in VBScript. Wie man den Benutzer aufgrund seines Anmeldenamens findet, steht hier: SelfADSI : Name Translation - Wie man den LDAP Pfad eines Benutzers ermittelt

     

    DOMAIN = "example"							'dies ist der NetBIOS Name Deiner Domäne
    ANMELDENAME = "pfoeckel"                    'hier den Namen des gewünschen Benutzers einsetzen
    TITLE = "x y z"								'das sind die Daten...
    PERSONALNUMMER = "0815"
    
    
    Const ADS_NAME_INITTYPE_GC = 3
    Const ADS_NAME_TYPE_NT4 = 3
    Const ADS_NAME_TYPE_1779 = 1
    
    logonName = DOMAIN & "\" & ANMELDENAME      'NetBIOS-Anmeldename bilden
    
    Set nto = CreateObject("NameTranslate")     'Name Translate Objekt initialisieren und Namen umwandeln
    nto.Init ADS_NAME_INITTYPE_GC, ""
    nto.Set ADS_NAME_TYPE_NT4, logonName
    userDN = nto.Get(ADS_NAME_TYPE_1779)        'userDN enthält nun den kompletten LDAP Pfad...
    
    Set user = GetObject("LDAP://" & userDN)    '...dieser kann zum Zugriff auf das Benutzerobjekt verwendet werden
    
    user.title = TITLE
    user.employeeType = PERSONALNUMMER
    user.SetInfo

     

    sollte das tatsächlich so gemeint sein, dass Deine Ausgansdaten (ANMELDENAME, PERSONALNUMMER etc... im Environment liegen, mußt Du noch das hier davorsetzen:

    Set wso= WScript.CreateObject(”WScript.Shell”)
    Set env= wso.Environment(”Process”)
    ANMELDENAME = env("ANMELDENAME")
    TITLE = env("TITLE")
    PERSONALNUMMER = env("PERSONALNUMMER")

     

    Schöne Grüße,

    Philipp

  8. Hallo benno,

     

    hmm, also ein "AccessRequest" ist bei den Standard-Attributen von AD nicht dabei, wird das vielleicht durch die Installation der Radius-Umgebung durch eine Schema-Erweiterung hinzugefügt? Von weitem ist es schwer zu sagen, wie Du damit umgehen sollst...

     

    Du mußt mal mit einem LDAP Browser (ADSIEdit, LEX, Softerra, etc.) direkt nachschauen, ob dieses Attribut bei Euren Benutzern vorhanden ist...

     

    Dann läßt es sich auch auslesen, z.B. mit einem Script oder mit DSQUERY.

     

    Gruß,

    Philipp

  9. Hallo,

     

    kleine Info: Details zu userAccountControl gibt's hier:

     

    SelfADSI : Attribute für AD User - userAccountControl

     

    Schau bitte nochmal genau welche Bits hier gesetzt sind...

     

     

    Wenn pwdLastSet = 0 ist, dann ist das Häckchen "Muß Passwort bei der nächsten Anmeldung setzen" aktiv, es ist also eigentlich normal, dass bei dem User 0 steht. Der Wert ist ein Microsoft Integer8-Zeitstempel, siehe hier:

     

    SelfADSI : Microsoft Timestamp / Interval Attribute mit Integer8 Syntax

     

    Gruß,

    Philipp

  10. Hallo,

     

    also wenn ich das so verstehen soll, dass Du wissen willst, ob und wann ein Benutzer im AD authentisiert wurde, dann ist es so, dass ALLE Anmeldungen, egal über welchen Kanal (Ctrl-Alt-Del an einer Station oder einem Server, NET USE übers Netz, über Radius gegen AD, pure LDAP-Verbindungen über Script etc. etc.) immer in den entsprechenden Attributen im Ad hinterlegt werden: lastLogon und lastLogonTimestamp.

     

    Es sind jedoch einige Details bei diesen Attributen zu beachten, schau am besten mal hier nach:

     

    SelfADSI : Attribute für AD User - lastLogon

     

    SelfADSI : Attribute für AD User - lastLogonTimestamp

     

    und das hier:

    SelfADSI : Microsoft Timestamp / Interval Attribute mit Integer8 Syntax

     

    Gruß,

    Philipp

  11. Hallo,

     

    sorry das ist etwas sehr unspezifisch, kannst Du nochmal beschreiben, was Du genau machen willst?

     

    Wenn Du meinst, dass ein Benutzer sich über Radius authentifiziert, meinst du damit den AD-integrierten IAS / NPS Radius?

     

    Und welche Information ist das, die Du genau herausbekommen willst? Anmeldenamen? Der müßte dem Benutzer ja bekannt sein, denn sonst hätte er sich nicht authentifizieren können. Oder willst generell Informationen anderer Objekte aus dem AD auslesen?

     

    Du siehst: Fragen über Fragen...

     

    Gruß,

    Philipp

  12. Hallo,

     

    also damit wir uns richtig verstehen:

     

    - Du bist lokal an einem funktionierenden DC angemeldet (evtl mit DCDIAG prüfen)

     

    - Du startest NTDSUTIL und gehst in "metatdata cleanup"

     

    - Du gibst "Connections" ein und sagst dann "connect to server xxx.example.com", wobei xxx dein eigener Server ist, an dem du gerade angemeldet bist. Und das klappt schon nicht??

     

    - Du gehst zurück auf die "metatdata cleanup" Ebene und gehst dann in "Select Operation Target". Hier mußt du den server angeben, der entfernt werden soll.

     

    - Dann sagst du "list domains" / "select domain X". X ist hier die Nummer der Domäne in der der betreffende Server steht.

     

    - Das Gleiche mit "list naming contexts" / "select naming context X"

     

    - Das Gleiche mit "list sites" / "select site X"

     

    - Das Gleiche mit "list servers in site" / "select server X"

     

    - Dann wieder zurücj und "remove selected server" Es kommt eine Warnung, die Du bestätigtst, nachdem Du sicher bist, dass du den Server ausgewählt hast, der verschwinden soll!

     

    Gruß,

    Philipp

  13. Hey,

     

    dein ursprünglicher Fehler trat auf, da Du einen so genannten "serverless LDAP Bind" durchgeführt hast, also das hier:

     

    strQuery = "<LDAP://DC=AAA,DC=de>;" ... usw

     

    Das klappt aber nur in der eigenen Domäne. Wenn man an eine fremde Domäne ran will, dann muss man stets eine Netzwerkadresse eines dortigen Domänencontrollers nehmen, in deinem Fall also eines von diesen hier:

     

    strQuery = "<LDAP://dc1.aaa.de/DC=AAA,DC=de>;" ... usw

    oder

    strQuery = "<LDAP://192.168.1.1/DC=AAA,DC=de>;" ... usw

    oder

    strQuery = "<LDAP://aaa.de/DC=AAA,DC=de>;" ... usw

     

    Das letzte Beispiel (dDomänenname AAA.de wird in eine IP-Adresse eines DCs aufgelöst) klappt nur, wenn das DNS dieser Domäne korrekt aufgesetzt ist. Das hat also mit Kerberos nix zu tun.

     

    Das ":389" kannst Du bei AD stets weglassen, AD-Domänencontroller antworten IMMER auf Port 389, wenns um LDAP geht, falls du zum Global Catalog willst, dann verwende hier das

     

    strQuery = "<LDAP://dc1.aaa.de:3268/DC=AAA,DC=de>;" ... usw

     

     

    Alles was du brauchst, wird hier detailliert beschrieben:

     

    SelfADSI : LDAP-Pfadnamen und Distinguished Names

    SelfADSI : LDAP Objekte im Verzeichnis suchen mit ADO

     

    Und hier noch ein komplettes Beispiel für die Suche in anderen Domänen/Forests, du mußt nur den LDAP-Filter abändern, denn es werden dort Domänencontroller gesucht. Abschnitt heißt "Alle Domänencontroller in irgendeiner Domäne/OU finden":

     

    SelfADSI : Active Direcory Domänencontroller suchen und finden

     

    Gruß,

    Philipp

  14. Hey,

     

    bei Deinem zweiten Fehler sieht es so aus, dass Du in der Zeile, in der Du den MA-USer anlegen willst, ein paar %-Zeichen vergessen hättest:

     

    Deine Zeile:

     

    dsadd user  CN=MA[%%e],ou=%OUD[1]%,ou=%OUC[1]%,ou=%OUB[1]%,ou=%OUA[3]%,%Stammstruktur%" -samid MAID[%%e] -upn MAID[%%e]@%DO1% -fn MAV[%%e] -mi MAIN[%%e] -ln MAN[%%e] -display "MA[%%e]" -pwd @Initialpassword -mustchpwd yes -disabled no

     

    Wahrscheinlich besser:

    dsadd user "CN=[color="Red"][b]%[/b][/color]MA[%%e][color="Red"][b]%[/b][/color],ou=%OUD[1]%,ou=%OUC[1]%,ou=%OUB[1]%,ou=%OUA[3]%,%Stammstruktur%" -samid MAID[%%e] -upn MAID[%%e]@%DO1% -fn MAV[%%e] -mi MAIN[%%e] -ln MAN[%%e] -display "MA[%%e]" -pwd @Initialpassword -mustchpwd yes -disabled no

     

    Nur so als Schätzung, ich weiss von solchen FOR-%%-Schleifen in DOS-Boxen sehr wenig.... Komplex ist es ja nicht, aber doch etwas umfangreicher....hast Du schonmal überlegt, es mit Powershell oder VBScript zu erledigen das ganze? :cool:

     

    Gruß,

    Philipp

  15. Hallo,

     

    du versuchst, die OU "OU=IDSbox,DC=IDSboxDE,DC=loc" anzulegen oder in dieser OU ein anders Objekt anzulegen. Heißt Deine Domäne denn auch IDSboxDE.loc? Die Fehlermeldung bedeutet nämlich, dass der LDAP-Pfad für die Domäne nicht korrekt ist/die Domäne nicht existiert, jedenfalls nicht aus Sicht des Domänencontrollers, an dem Du gerade angemeldet bist....

     

    Details zum Aufbau eines korrekten LDAP-Pfads:

    SelfADSI : LDAP-Pfadnamen und Distinguished Names

     

    Falls IDSboxDE.loc doch der korrekte Name Deiner Domäne ist: Führst Du das Script vielleicht auf einem Rechner aus, der garnicht Mitglied in der Domäne IDSboxDE.loc ist?

     

    Gruß,

    Philipp

  16. Hallo

     

    ich nehme mal an, die 10.0.1.120 und 10.0.1.100 sind ehemalige DCs, du solltest die entsprechenden Einträge in der DNS-Verwaltung (dnsmgmt.msc) aus der betreffenden Zone löschen, dort findest du sie als

     

    (identisch mit übergeordnetem Order), Typ: Host (A-Record), 10.0.1.120

    (identisch mit übergeordnetem Order), Typ: Host (A-Record), 10.0.1.100

     

    Bei Abfragen an deinen Domänennamen kommen sonst in 50% der Fälle diese IPs zurück, hinter denen keine DCs (mehr) stehen. Diese Abfragen können bei der Site-Detection der Domänenmitglieder, der GPO-Verrbeitung oder insbesondere in Domänen-basiertem DFS eine Rolle spielen und dementsprechend dann Störungen verursachen.

     

    Ein falsch konfiguriertes DNS ist die URsache für die überwiegende Anzahl von AD-Problemen!! Also am besten auch allgemein mal prüfen mit

     

    DNSLint /d DomainName /ad

     

    Beschreibung des Dienstprogramms "DNSLint"

     

     

    Gruß,

    Philipp

  17. Hey,

     

    wenn du es direkt im eigenen Script machen willst, ist SelfADSI Dein Freund :cool:

     

    SelfADSI : LDAP Verzeichnisobjekte erzeugen

     

    Wenn Du das mit der "lokalen und globalen Gruppe" so gemeint hast, dass 2 Gruppen angelegt werden sollen, so geht das nicht, denn in einer OU können keine zwei gleichnaigen Objekte liegen. Ich mache in meinem Beispiel einfach mal eine globale Gruppe, die so heißt wie die OU mit angehängtem "-group".

     

    parentDN = "ou=intrust,ou=dienste,dc=tzd,dc=tbwl,dc=de"
    ouName = InputBox("Geben Sie den Namen der neuen OU ein","OU Name")
    
    'OU erzeugen
    Set parentOU = GetObject("LDAP://" & parentDN)
    Set newOU = parentOU.Create("organizationalUnit", "ou=" & ouName)
    newOU.SetInfo
    
    'Gruppe erzeugen
    ADS_GROUP_TYPE_GLOBAL_GROUP     = &H00000002
    ADS_GROUP_TYPE_SECURITY_ENABLED = &H80000000
    
    Set newGroup = newOU.Create("group", "cn=" & ouName & "-group")
    newGroup.sAMAccountName = ouName & "-group"
    newGroup.groupType = ADS_GROUP_TYPE_GLOBAL_GROUP Or ADS_GROUP_TYPE_SECURITY_ENABLED
    newGroup.SetInfo
    
    '30 User erzeugen und zur Gruppe hinzufügen
    for i=0 to 29
       Set newUser = newOU.Create("user", "cn=User" & i)
       newUser.sAMAccountName = "User" & i
       newUser.userAccountControl = 544       '512 + 32 = Normal Account / Password not required
       newUser.SetInfo
    
       newGroup.Add(newUser.AdsPath)
    next

     

    Also bei mir läuft's durch...

     

    Gruß,

    Philipp

  18. Hmm,

     

    also ein Array könntest Du innerhalb des Scripts schon aufbauen, dass würde dann so aussehen:

     

    myArray = Array()

     

    Set ou = GetObject("LDAP://apjet01.test.de/ou=AVB,ou=BE,ou=MUE,dc=test,dc=de")

     

    For Each obj In ou

    WScript.Echo obj.name

    Redim Preserve myArray(Ubound(myArray)+1) ' ...das Array vergrössern

    myArray(Ubound(myArray)) = obj.name ' ...und ein neues Element hinzu

    Next

     

    Aber Du hast dann wahrscheinlich Schwierigkeiten das Array mit einem anderen zu vergleichen innerhalb von vbscript...

     

    Wie wäre es denn, wenn Du die Ausgabe Deines ursprünglichen Scripts in eine Datei umleitest:

     

    c:\> cscript test.vbs >Ausgabe.txt

     

    in Ausgabe.txt stehen jetzt alle Usernamen, die Du in den OUs gefunden hast. Die kannst du dann mit SORT sortieren und hast eine Liste, die du vergleichen kannst mit sonstwas...

     

    Gruß,

    Philipp

  19. Hallo, ich auch nochmal,

     

    also Du kannst den Wert von pwdLastSet auch garnicht auf einen bestimmten Wert ändern, selbst wenn du den korrekten Integer8-Wert eines bestimmten Datums hast. Nur die Werte 0 und -1 sind erlaubt, ansonsten gibt's ein Fehler DSID-031A0FB6 Invalid Argument...

     

    Wenn Du eine W2K8 Umgebung hast, dann setz eine Fine Grained Password Policy und lass für deinen einen Testuser das PAsswort in einem Tag ablaufen....Ansonsten setzt Du Dir tatsächlich lieber mal kurz ein Test-AD auf, in dem du die Domain Paswortrichtlinien setzen kannst.

     

    Gruß,

    Philipp

  20. Hallo,

     

    du willst wahrscheinlich nach etwas suchen, von dem du nicht weißt in welchem Attribut es gespeichert wird..... eines derartige LDAP-Search Anfrage ist nicht vorgesehen. Allerdings könntest du mit LDIFDE.EXE einen Export aller Objekte inklusive aller Attribute machen und die dadurch erzeugte Text-Datei dann durchsuchen. Da fehlen zwar dann die Operational Attributes, aber die willst Du wahrscheinlich gar nicht sehen...

     

    Gruß,

    Philipp

  21. Hallo,

     

    also: Wann ein Benutzer das letzte Mal sein Passwort verändert hat, steht im Attribut pwdLastSet. Das Format ist leider das ziemlich schlecht lesbare Microsoft Integer8 (100-Nanosekunden-Abschnitte seit 1.1.1600!). Aber hier siehst du, wie man es umrechnen kann:

     

    SelfADSI : Microsoft Timestamp / Interval Attribute mit Integer8 Syntax

     

    Dann brauchst du noch das maximale Passwort-alter der Domäne, damit du das Ablaufdatum für jeden Benutzer errechnen kannst. Das steht (in der Default Domain Policy - und auch) im Domänenobjekt in der eigenschaft maxPwdAge. Auch dies ist Integer8, negativer Wert der 100 Nanosekunden-Abschnitte....

     

    Naja, ein bisschen rumgerechnet, das alles mit einer ADO-Suche auf AD User gekoppelt - und das VB Script hier spuckt Dir Deine Liste bzgl. Passwort-Setzen aus:

     

    ldapFilter = "(sAMAccountType=805306368)"     '  <- User-Objekte
    
    Set rootDSE = GetObject("LDAP://rootDSE")
    domainDN = rootDSE.Get("defaultNamingContext")
    
    Set objDomain = GetObject("LDAP://" & domainDN)
    Set interval = objDomain.maxPwdAge
    domainPwAge = LargeIntegerToMinutes(interval)
    WScript.Echo "Maximales Passwortalter ist: " & (domainPwAge/1440)  & " Tage"
    WScript.Echo
    
    Set ado = CreateObject("ADODB.Connection")
    ado.Provider = "ADSDSOObject"
    ado.Open "ADSearch" 
    Set objectList = ado.Execute("<LDAP://" & domainDN & ">;" & ldapFilter & ";distinguishedName,pwdLastSet;subtree")
    
    While Not objectList.EOF
       pWSetValue = objectList.Fields("pwdLastSet")
       pwLastSet = LargeIntegerToDate(pWSetValue)
       pwNextSet = DateAdd("n", domainPwAge, pwLastSet)
    
       WScript.Echo objectList.Fields("distinguishedName") & " : " & pwLastSet & " : " & pwNextSet
    
       objectList.MoveNext
    Wend
    
    
    '____________________ [ LargeIntegerToDate ]
    '
    '
    Function LargeIntegerToDate(value)
    'nimmmt einen Microsoft LargeInteger Wert (Integer8) und gibt das entsprechende Datum plus Uhrzeit zurück
    
       Set sho = CreateObject("Wscript.Shell")
       timeShiftValue = sho.RegRead("HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias")
       If IsArray(timeShiftValue) Then
           timeShift = 0
           For i = 0 To UBound(timeShiftValue)
               timeShift = timeShift + (timeShiftValue(i) * 256^i)
           Next
       Else
           timeShift = timeShiftValue
       End If
    
       i8High = value.HighPart
       i8Low = value.LowPart
       If (i8Low < 0) Then
           i8High = i8High + 1
       End If
    
       If (i8High = 0) And (i8Low = 0) Then
           LargeIntegerToDate = #1/1/1601#
       Else
           LargeIntegerToDate = #1/1/1601# + (((i8High * 2^32) + i8Low)/600000000 - timeShift)/1440
       End If
    End Function
    
    
    '_____________________________ [ LargeIntegerToMinutes ]
    '
    '
    Function LargeIntegerToMinutes(value)
    'nimmmt einen Microsoft LargeInteger Wert (Integer8) und gibt das entsprechende ...
    '... Zeitinterval in Minuten zurück (-1 für "Never")
    
       If (value.HighPart = -2147483648) And (value.LowPart = 0) then
           LargeIntegerToMinutes = -1
       Else
           i8High = value.HighPart
           i8Low = value.LowPart
           If (i8Low < 0) Then
               i8High = i8High + 1
           End If
    
           LargeIntegerToMinutes = -(((i8High * 2^32) + i8Low)/600000000)
       End If
    End Function

     

    Vorsicht, wenn du >1000 Benutzer hast, dann mußt Du eine PagedResults-Suche durchführen. Dann muß nochmal ein bisschen verändert werden, siehe hier:

     

    SelfADSI : LDAP Objekte im Verzeichnis suchen mit ADO

     

    Gruß,

    Philipp

×
×
  • Neu erstellen...