Active Directory (Domain): Anfragen ob User in der AD existiert

  • Ich habe nochmals geforscht und ich glaube, die verwechselt was. So wie ich das verstehe, läuft nicht der Account ab sondern das Passwort für den Account.
    Lass mal _AD_IsPasswordExpired($pc & "$") laufen und schau, ob das Ergebnis für PCs, die schon länger nicht mehr in der Domäne sind, stimmt.

  • Es geht mir darum, dass ich u.a. einen Service unter einem "ServiceUser" laufen lassen soll, in mehreren Domains. Um das umzusetzen muss man das Kennwort wissen. Ziel ist es, gewissen Applikationen die "System" rechte zu nehmen. Dafür werden Serviceuser erstellt, die immer genau dazu die Rechte haben, die unbedingt notwendig sind.

    Da es leider immer wieder vorkam - das so ein Script nicht funktionierte, weil der User nicht angelegt war oder das Kennwort nicht entsprechend gesetzt war - würde ich gerne zu begin des Scripts überprüfen - ob der User existiert, ob das PW richtig ist - und wenn etwas nicht stimmt - aus dem Script aussteigen, mit einem passenden Exitcode (und Eventlog Eintrag).

    @MK: ich erhalte zweimal den Fehler:

    Fehlernummer: 80020009
    Beschreibung: A referral was returned from the server.

    Ich hoffe ihr wisst rat. So ganz ohne "Errorhandling" gebe ich so ein Script ungern weiter.

  • Ich glaube mit Post 18 habe ich schon die Lösung gefunden.
    Hier laufen wirklich die PC Namen ab.


    Hi Norman,

    Computer accounts laufen nur dann ab, wenn die property "account expires" manuell gesetzt wird. Um "automatisch" alle Computer herauszufinden, die längere Zeit nicht im Netz waren, wird zwischen Computer und AD regelmäßig ein Passwort mit Ablaufdatum gesetzt. Details findest Du hier.
    Mit der Funktion _AD_GetPasswordExpired kannst Du alle Computer abfragen, deren Passwort vor mehr als x Tagen abgelaufen ist.


  • @MK: ich erhalte zweimal den Fehler:

    Fehlernummer: 80020009
    Beschreibung: A referral was returned from the server.

    Ich hoffe ihr wisst rat. So ganz ohne "Errorhandling" gebe ich so ein Script ungern weiter.


    "A referral was returned from the server." bedeutet, dass der Domänen Controller den Du angefragt hast, die Informationen nicht hat, er aber weiss, dass ein anderer DC in der Domäne die Anfrage beantworten kann und er Dich dahin verweist.
    Da Du aber nur Lesezugriff benötigst, kannst Du auch einen Global Catalog abfragen. Wie das geht, findest Du im Wiki (siehe Signatur).

  • @ water: Danke für den Hinweis zur Fehlermeldung! ich hab dein UDF sogar an anderer Stelle schon im Einsatz, um den DNShostname auszulesen.

    Spoiler anzeigen
    [autoit]

    _AD_Open()
    Global $sComputer = @ComputerName & "$"
    Global $sDNSHostName = _AD_GetObjectAttribute($sComputer, "DNSHostName")
    _AD_Close()

    [/autoit]

    Trotzdem bin ich auch nach längerem herumprobieren nicht zu einer Lösung gekommen, oder hätte auch nur erahnt, wie ich die gegebenen credentials damit gegenüber einer Domain abfragen könnte. :wacko:

    Das muss einem anscheinend in die Wiege gelegt worden sein. Wiki hab ich auch schon durchstöbert - sorry ich bin da einfach zu blond. :huh:

  • Es geht nicht um's Abfragen sondern darum, die Credentials dem _AD_Open Befehl mitzugeben. Bringt er einen Fehler, dann stimmt die UserId oder das Passwort nicht.
    Sieh Dir mal das Beispielscript für _AD_Open an und übergib einen falschen Namen oder ein falsches Passwort. Das wird vom Skript abgefangen und mit einer Fehlrmeldung angezeigt.

  • Ahh, so langsam fällt der groschen ;)


    [autoit]


    _AD_Open()
    $iResult = _AD_Open("domain\User", "Kennwort")
    MsgBox(4096, "Eins = Erfolg:", $iResult)
    _AD_Close()

    [/autoit]


    Wie kann ich da jetzt noch Variablen ins Spiel bringen, z.B. so:


    [autoit]


    _AD_Open()
    $iResult = _AD_Open( $domain & "\" & $User , "Kennwort")
    MsgBox(4096, "Eins = Erfolg:", $iResult)
    _AD_Close()

    [/autoit]

    Variablen scheinen nicht zu gehen ;( Auch Versuche mit Chr(34) - nix :(


    Danke für eure Hilfe :)

  • Lass das erste "_AD_Open()" weg.

  • [autoit]

    #include <ad.au3>
    $domain = "MyDomain"
    $User="MyUser"
    $iResult = _AD_Open( chr(34) & $domain & "\" & $User & chr(34), "MyPW")
    MsgBox(4096, "Eins = Erfolg:", $iResult)

    [/autoit]

    Leider klappt es auch so nicht. Aber doppelt gemoppelt war es schon :whistling:

  • [autoit]

    #include <AD.au3>
    $domain = "MyDomain"
    $User="MyUser"
    $iResult = _AD_Open($domain & "\" & $User, "MyPW")
    MsgBox(4096, "Eins = Erfolg:", $iResult)

    [/autoit]

    Sollte funktionieren.

  • Danke Dir water! Ich komme einer Lösung langsam näher.

    Es klappt mit deinen Zeilen, wenn ich nur den Domain Namen nehme.

    Da es bei uns jedoch auch MyDomain.com und MyDomain.test hat, muss ich mit dem kompletten Domainnamen nehmen - und da klappt es leider nicht mehr ;( Ohne Variablen hingegen schon...

    Einmal editiert, zuletzt von Surfy (23. August 2012 um 08:43)

  • Wenn Du gegen verschiedene, voneinander unabhängige Domänen prüfen willst (also der Global Catalog wie in Post #4 empfohlen nicht funktioniert), dann bleibt Dir nichts anderes übrig als bei _AD_Open alle Parameter mitzugeben. Also:

    $sAD_DNSDomainParam - Optional: Active Directory domain name if you want to connect to an alternate domain e.g. DC=microsoft,DC=com
    $sAD_HostServerParam - Optional: Name of Domain Controller if you want to connect to a different domain e.g. DC-Server1.microsoft.com
    $sAD_ConfigurationParam - Optional: Configuration naming context if you want to connect to a different domain e.g. CN=Configuration,DC=microsoft,DC=com

  • Folgender Script schlägt bei mir fehl, wenn wenn ich ihn in der Domain MyDomain.test ausführe:

    Spoiler anzeigen
    [autoit]

    #include <ad.au3>
    ;°°°°° °°°°° Recognize Domain Enviroment °°°°° °°°°°
    _AD_Open()
    Global $sComputer = @ComputerName & "$"
    Global $sDNSHostName = _AD_GetObjectAttribute($sComputer, "DNSHostName")
    _AD_Close()
    ;°°°°° °°°°° Parse Result °°°°° °°°°°
    $Split = StringSplit($sDNSHostName, ".")
    $Hostname = $Split[1]
    $Domainname = $Split[2]
    $Domainsuffix = $Split[3]
    RUNWAIT (@COMSPEC & ' /c eventcreate /t information /so MyInstaller /id 100 /l application /d "Detected: Hostname: ' & $Hostname & " Domainname: " & $Domainname & " Domainsuffix: " & $Domainsuffix & ' ..."',"",@SW_HIDE)
    ;°°°°° °°°°° Check User and Credentials Result °°°°° °°°°°
    $iResult = _AD_Open($Domainname & "\x_Service-Account1", "MyPassWord")
    $iResult2 = _AD_Open($Domainname & "\y_Service-Account2", "MyPassWord")
    MsgBox(4096, "Eins = Erfolg:", $iResult)
    MsgBox(4096, "Eins = Erfolg:", $iResult2)

    [/autoit]

    Nehme ich anstelle von der $Domainname variable dann @LogonDomain dann geht es. Diese Variable lautet aber auf MyDomain-Test also ohne Punkt ;(

    Gibt es keine Chance, die Usercredentials zu überprüfen, wenn die Domain Namen alles sein können, von MyDomain.com, MyDomain.Local, MyDomain.test, MyOtherDomain.local etc?

    Vielleicht gibt es ja eine schlauere Art das ganze anzustellen?

    Danke euch, Surfy

  • Wenn Du Dich mit einem PC z.B. bei MyDomain.test anmeldest, welchen Wert hat dann @LogonDomain?

  • Leider muss ich den alten Hund hier nochmals ausgraben :wacko:

    Mein Lösungsansatz mit LogonDomain geht auch nicht via Softwareverteilung, da hier der Script via "Local System" context (principial) ausgeführt wird.

    Fällt Dir dazu noch etwas ein?