Wie kann man mit einer .CMD in einer AD die verbleibende Gültigkeit des Passwortes ermitteln
Hallo und Moinmoin.
Ich werde erst etwas ausholen um die Hintergründe etwas zu erläutern und dann, kenntlich, zur eigentlichen Frage zu kommen
Vorwort:
Ich bin im IT Support bei einer mittelgroßen Firma im Onsite Team.
Unter anderem supporte ich auch mit den Vorstand.
Unser Ansehen ist bei den Anwendern recht gut, deswegen kommen die auch gerne zu uns.
Wie auch immer,
jetzt ist den IT Chefs etwas ziemlich .... "dummes" ist das falsche Wort, aber... eingefallen.
Und zwar haben Sie sich die neue BES Struktur andrehen lassen mit dem Q10.
Dieses wird bei uns verschlüsselt und über Pull betrieben.
Das heißt das man immer ein Geräte Passwort eingeben muss.
Das finde ich nicht schlecht an sich.
Was nur nicht so schön ist, ist die Einstellung das das PW alle 90 Tage geändert werden muss.
Was richtig sch***limm daran ist, ist das die Anwender darüber nicht informiert werden.
Das sie nicht nur das Geräte Passwort neu eingeben müssen, sondern nach der Änderung ihr Windows Passwort auf dem BB erneut eingeben müssen!
Und ausbaden dürfen wir es.
Und da unser Vorstand nicht sehr Technik Affin ist, bis auf den CTO , ich ebenfalls sehr.
Auf unsere Kritik diesbezüglich hingewiesen, wurde gesagt das das nicht lösbar ist.
Dies wollen wir nicht so hinnehmen und haben nachgedacht.
Das ZIEL:
Das Ziel ist, dass das Startskript, das eh immer beim Starten durchläuft, überprüft, ob die Restdauer, bis man das Passwort ändern muss, unter einen einstellbaren Wert, z.b. 14 Tagen, fällt.
Bzw. wieder genau 90 Tage sind.
Sprich das das PW eben geändert wurde.
Dann soll jeweils ein (anderes) Textfenster aufgehen mit einer Erinnerung an das BB.
Das BEIDE Passwörter dort zu ändern sind
Kein heroisches Ziel, sondern eine praktische Erleichterung.
Für uns
Mir kam gleich der Befehl
net user /domain %username%
in den Kopf der u.a. DAS anzeigt.
Und leider hat mich mein Linux lehrer in der Beziehung damals etwas "versaut":
Wir haben Skripten etwas gelernt.
Aber unter Linux.
Und dort ist mir gleich eine pipe in den Kopf gekommen bzw irgendeine Variable gab es da.
Deswegen habe ich gesagt das ich mal schaue
Nur arbeiten wir mit Windows.
Mittlerweile fast ausschließlich 7.
Zu mir:
Ich habe, wie schon erwähnt, während meiner Ausbildung etwas mit Skripten unter Linux zu tun.
Und ich habe auch schon ein paar Skripte als CMD hin bekommen.
Ich habe aber keine Veranlagungen zum Programmieren
Ja, ich muss zugeben das ich mir meine Skripte zusammen "klaue".
Hier etwas her und dort etwas her.
Und das zu der Funktion zusammen schreiben die ich benötige.
Mit viel Testen.
Aber ich glaube das ist zu 90% so beim programmieren.
Wie auch immer,
ich habe mir zwar Power Shell etwas angesehen, bin aber aus einem einfachen Grund noch nicht dort eingestiegen:
Unter 7 ist es nicht standardmäßig aktiv.
Und für mich ist skripten ein SEHR praktisches Werkzeug.
Nicht weniger, aber auch nicht mehr.
Es ist Arbeit für mich mich einzuarbeiten.
Und wenn ich das nicht für "alles" im Berufsalltag benutzen kann...
Ich habe Skripte gefunden die das Problem vielleicht (!) lösen können.
Die Abfrage nach der verbleibenden Passwort Länge.
Aber was ich gefunden habe war in VBS.
Ich wäre deshalb auch dankbar für Hinweise wie ich "relativ einfach" ein Grundverständniss für VBS entwickeln kann.
Alles Tiefer gehende ist überall Arbeit
Das Konzept was ich mir gedacht habe ist das folgende:
Ich ermittele was der %username% noch für eine verbleibende Zeit hat bis sein PW abläuft.
Mit dem net user /domain Befehl würde ich zwar nur ein Datum bekommen,
aber man kann ja die Differenz zu dem jetzigen Datum errechnen.
In Excel geht das, und bei der CMD habe ich das auch schon mal gesehen.
(Ich weiß das man Excel und CMD NICHT vergleichen kann Aber beides ist ein MS Produkt, und die haben ihre eigene Mentalität).
Wie schon erwähnt würde eines von 2 Textfenstern aufgehen.
Bei dem Ergebnis von zb x<=14 Tage und y>=88Tage.
Sprich Das bald die Pflicht ansteht PW zu wechseln, bzw der PW wechsel schon stattgefunden hat.
Könnte ich aus der Ausgabe von net user %username% (dadurch das er in der AD ist natürlich >net user /domain %username%<) über eine pipe den Wert von >Kennwort läuft ab< extrahieren?
Ich wäre auch für alle anderen Vorschläge dankbar!
MfG
Thomas D.
Ich werde erst etwas ausholen um die Hintergründe etwas zu erläutern und dann, kenntlich, zur eigentlichen Frage zu kommen
Vorwort:
Ich bin im IT Support bei einer mittelgroßen Firma im Onsite Team.
Unter anderem supporte ich auch mit den Vorstand.
Unser Ansehen ist bei den Anwendern recht gut, deswegen kommen die auch gerne zu uns.
Wie auch immer,
jetzt ist den IT Chefs etwas ziemlich .... "dummes" ist das falsche Wort, aber... eingefallen.
Und zwar haben Sie sich die neue BES Struktur andrehen lassen mit dem Q10.
Dieses wird bei uns verschlüsselt und über Pull betrieben.
Das heißt das man immer ein Geräte Passwort eingeben muss.
Das finde ich nicht schlecht an sich.
Was nur nicht so schön ist, ist die Einstellung das das PW alle 90 Tage geändert werden muss.
Was richtig sch***limm daran ist, ist das die Anwender darüber nicht informiert werden.
Das sie nicht nur das Geräte Passwort neu eingeben müssen, sondern nach der Änderung ihr Windows Passwort auf dem BB erneut eingeben müssen!
Und ausbaden dürfen wir es.
Und da unser Vorstand nicht sehr Technik Affin ist, bis auf den CTO , ich ebenfalls sehr.
Auf unsere Kritik diesbezüglich hingewiesen, wurde gesagt das das nicht lösbar ist.
Dies wollen wir nicht so hinnehmen und haben nachgedacht.
Das ZIEL:
Das Ziel ist, dass das Startskript, das eh immer beim Starten durchläuft, überprüft, ob die Restdauer, bis man das Passwort ändern muss, unter einen einstellbaren Wert, z.b. 14 Tagen, fällt.
Bzw. wieder genau 90 Tage sind.
Sprich das das PW eben geändert wurde.
Dann soll jeweils ein (anderes) Textfenster aufgehen mit einer Erinnerung an das BB.
Das BEIDE Passwörter dort zu ändern sind
Kein heroisches Ziel, sondern eine praktische Erleichterung.
Für uns
Mir kam gleich der Befehl
net user /domain %username%
in den Kopf der u.a. DAS anzeigt.
Und leider hat mich mein Linux lehrer in der Beziehung damals etwas "versaut":
Wir haben Skripten etwas gelernt.
Aber unter Linux.
Und dort ist mir gleich eine pipe in den Kopf gekommen bzw irgendeine Variable gab es da.
Deswegen habe ich gesagt das ich mal schaue
Nur arbeiten wir mit Windows.
Mittlerweile fast ausschließlich 7.
Zu mir:
Ich habe, wie schon erwähnt, während meiner Ausbildung etwas mit Skripten unter Linux zu tun.
Und ich habe auch schon ein paar Skripte als CMD hin bekommen.
Ich habe aber keine Veranlagungen zum Programmieren
Ja, ich muss zugeben das ich mir meine Skripte zusammen "klaue".
Hier etwas her und dort etwas her.
Und das zu der Funktion zusammen schreiben die ich benötige.
Mit viel Testen.
Aber ich glaube das ist zu 90% so beim programmieren.
Wie auch immer,
ich habe mir zwar Power Shell etwas angesehen, bin aber aus einem einfachen Grund noch nicht dort eingestiegen:
Unter 7 ist es nicht standardmäßig aktiv.
Und für mich ist skripten ein SEHR praktisches Werkzeug.
Nicht weniger, aber auch nicht mehr.
Es ist Arbeit für mich mich einzuarbeiten.
Und wenn ich das nicht für "alles" im Berufsalltag benutzen kann...
Ich habe Skripte gefunden die das Problem vielleicht (!) lösen können.
Die Abfrage nach der verbleibenden Passwort Länge.
Aber was ich gefunden habe war in VBS.
Ich wäre deshalb auch dankbar für Hinweise wie ich "relativ einfach" ein Grundverständniss für VBS entwickeln kann.
Alles Tiefer gehende ist überall Arbeit
Das Konzept was ich mir gedacht habe ist das folgende:
Ich ermittele was der %username% noch für eine verbleibende Zeit hat bis sein PW abläuft.
Mit dem net user /domain Befehl würde ich zwar nur ein Datum bekommen,
aber man kann ja die Differenz zu dem jetzigen Datum errechnen.
In Excel geht das, und bei der CMD habe ich das auch schon mal gesehen.
(Ich weiß das man Excel und CMD NICHT vergleichen kann Aber beides ist ein MS Produkt, und die haben ihre eigene Mentalität).
Wie schon erwähnt würde eines von 2 Textfenstern aufgehen.
Bei dem Ergebnis von zb x<=14 Tage und y>=88Tage.
Sprich Das bald die Pflicht ansteht PW zu wechseln, bzw der PW wechsel schon stattgefunden hat.
Könnte ich aus der Ausgabe von net user %username% (dadurch das er in der AD ist natürlich >net user /domain %username%<) über eine pipe den Wert von >Kennwort läuft ab< extrahieren?
Ich wäre auch für alle anderen Vorschläge dankbar!
MfG
Thomas D.
Please also mark the comments that contributed to the solution of the article
Content-ID: 237659
Url: https://administrator.de/contentid/237659
Printed on: December 12, 2024 at 00:12 o'clock
12 Comments
Latest comment
Mahlzeit.
Hui, ganz schöner Roman.
Wir lösen das ein wenig anders: Auf einem Server läuft ein Powershell-Skript, welches die Zeit bis zum Passwort-Ablauf für alle User ermittelt - liegt der Wert unter 14 Tagen, geht eine Mail an die Benutzer raus; der Text der Mail ist dabei frei editierbar, einen Hinweis darauf, dass das Passwort auch auf dem Berry geändert werden muss lässt sich einbauen, zusammen z.B. mit einem Link ins Intranet, wo dieser Vorgang dann nochmal erläutert wird....
Bevor ich weiterschreibe:
Wäre das eine Lösung für euch?
Setzt eben ein Windows-AD (oder ein wie auch immer geartetes, zentrales Userverzeichnis) voraus und einen Mailserver, der mal eben die Benachrichtigungsmail an die User raushaut.
Cheers,
jsysde
Hui, ganz schöner Roman.
Wir lösen das ein wenig anders: Auf einem Server läuft ein Powershell-Skript, welches die Zeit bis zum Passwort-Ablauf für alle User ermittelt - liegt der Wert unter 14 Tagen, geht eine Mail an die Benutzer raus; der Text der Mail ist dabei frei editierbar, einen Hinweis darauf, dass das Passwort auch auf dem Berry geändert werden muss lässt sich einbauen, zusammen z.B. mit einem Link ins Intranet, wo dieser Vorgang dann nochmal erläutert wird....
Bevor ich weiterschreibe:
Wäre das eine Lösung für euch?
Setzt eben ein Windows-AD (oder ein wie auch immer geartetes, zentrales Userverzeichnis) voraus und einen Mailserver, der mal eben die Benachrichtigungsmail an die User raushaut.
Cheers,
jsysde
Hallo TomTomBon!
Per Batch erhältst Du den gesuchten Wert etwa so:
Für die Berechnung der Zeitdauer bis zu diesem Datum ist allerdings Batch nicht wirklich das richtige Werkzeug - dafür würde sich ein (durch den Batch selbst erzeugtes) VBScript (erledigt auch gleich die Ausgabe) aufdrängen - ungetestet zB:
Grüße
bastla
Per Batch erhältst Du den gesuchten Wert etwa so:
for /f "tokens=4" %%i in ('net user %username% /domain^|findstr /bc:"Kennwort l"') do set "Datum=%%i"
@echo off & setlocal
set Frist1=14
set Frist2=88
set "VBS=%temp%\Info.vbs"
>%VBS% echo Ablauf=DateValue(WScript.Arguments(0)):Tage=DateDiff("d",Date,Ablauf)
>>%VBS% echo If Tage^<=%Frist1% Then MsgBox("Passwortablauf in "^&Tage^&" Tagen!")
>>%VBS% echo If Tage^>=%Frist2% Then MsgBox("Passwortwechsel vor Kurzem erfolgt!")
for /f "tokens=4-7 delims=/ " %%i in ('net user %username% /domain^|findstr /bc:"Kennwort l"') do set "M=%%i" & set "T=%%j" & set "J=%%k"
if /i "%M%" neq "Nie" %VBS% %T%.%M%.%J%
bastla
Hallo Thomas,
oder du nimmst folgendes VBS-Script, welches sich die Informationen des aktuell anmeldenden Nutzers direkt aus dem ActiveDirectory zieht (normal Benutzerrechte reichen dafür völlig aus) und daraus die entsprechende Information bzw. Meldung für den User generiert:
(Die Warnschwelle lässt ich in der Konstanten WARNDAYS festlegen)
Zur Info: Wenn das Script als Logon-Script eingebunden werden soll muss natürlich die entsprechende GPO zum sichtbaren Ausführen von Logon-Scripts aktiviert sein, sonst sehen die User die Message-Box nicht.
Grüße Uwe
oder du nimmst folgendes VBS-Script, welches sich die Informationen des aktuell anmeldenden Nutzers direkt aus dem ActiveDirectory zieht (normal Benutzerrechte reichen dafür völlig aus) und daraus die entsprechende Information bzw. Meldung für den User generiert:
(Die Warnschwelle lässt ich in der Konstanten WARNDAYS festlegen)
On Error Resume Next
Const WARNDAYS = 14
'-------------------
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
Set objSysInfo = CreateObject("ADSystemInfo")
Set objUserLDAP = GetObject ("LDAP://" & objSysInfo.Username)
intCurrentValue = objUserLDAP.Get("userAccountControl")
If not intCurrentValue and ADS_UF_DONT_EXPIRE_PASSWD Then
dateChanged = objUserLDAP.PasswordLastChanged
intPWAlter = int(now - dateChanged)
Set objDomainNT = GetObject("WinNT://" & objSysinfo.DomainShortName)
intMaxPwdAge = objDomainNT.Get("MaxPasswordAge")
If intMaxPwdAge > 0 Then
intMaxPwdAge = (intMaxPwdAge/86400)
dateAblauf = DateValue(dateChanged + intMaxPwdAge)
If intPWAlter < intMaxPwdAge and int(dateAblauf-now) <= WARNDAYS then
msgbox "ACHTUNG: Ihr Passwort läuft in " & int(dateAblauf-now) & " Tag(en) ab." & vbNewline & "Bitte ändern sie es rechtzeitig vor Ablauf am " & dateAblauf & " !", vbExclamation
End If
End If
End If
VBS/WSH Developer Referenzen und Tutorials findest du hier:
- Visual Basic-Referenz
- Windows Script Host -Referenz
- http://www.w3schools.com/vbScript/default.asp
- http://www.dokuwelt.de/tutorials_artikel.php?kategorieID=1&themenID ...
Grüße Uwe
Hallo TomTomBon!
da vorweg die Ausgabe des "
Im zweiten Ansatz habe ich übrigens das Datum gleich in seine Bestandteile zerlegt (und dazu als Trennzeichen Leerzeichen und "/" vorgegeben) - daraus entstehen dann die Variablen %%i, %%j und %%k.
Grüße
bastla
heißt für mich das eine for schleife gestartet wird, die den 4ten "satz" der net user Abfrage in die Variable i schreibt.
Nope - "tokens" sind die Bestandteile einer Zeile (getrennt durch - defaultmäßig - Leerzeichen oder TAB), demzufolge also eher "Felder". Die Schleife verarbeitet alle "Sätze" (Zeilen), die sich aus dem geklammerten Teil ergeben - in diesem Fall also nur die eine Zeile der ArtKennwort läuft ab 5/21/2014 7:46 AM
net use
" per "findstr
" nach Zeilen, die mit "Kennwort l" beginnen, gefiltert wird. Token 4 ist (da mehrere aufeinander folgende Trennzeichen - hier die Leerzeichen nach "ab" - nur als eines zählen) "5/21/2014" (Token 5 und 6 wären demnach "7:46" und "AM"). Dieses Token stellt den Inhalt von %%i dar und wird zur weiteren Verwendung der Variablen %Datum% zugewiesen.Oder nur der "optik" wegen?
Tatsächlich ließe sich nach dem "do
" die Variable %%i gleich unmittelbar weiter verwenden; wenn allerdings die "for
"-Schleife verlassen wird, existiert %%i nicht mehr, daher die Zwischenspeicherung.Im zweiten Ansatz habe ich übrigens das Datum gleich in seine Bestandteile zerlegt (und dazu als Trennzeichen Leerzeichen und "/" vorgegeben) - daraus entstehen dann die Variablen %%i, %%j und %%k.
Grüße
bastla
Hallo Zusammen,
Hat jemand mit
folgende Codes für VBS Skript Erfahrung?:
bei uns auf Win2008r2x64 für Win7Prox64 und x86 Clients funktionierte bis wenigen Wochen noch einwandfrei.
Seit dem, Jeder Clients, Benutzer Anmeldung, erhält die Code nur mit "Passwort läuft ab in: Tagen" obwohl Unter AC- Benutzer- Benutzer Eigenschaften- Kontooptionen auf "Passwort läuft nie ab" angehakt ist...
Hat jemand mit
folgende Codes für VBS Skript Erfahrung?:
Function PasswordExpires(strDomain,strUser)
On Error Resume Next
Dim objUser
Set objUser=GetObject("WinNT://" & strDomain & "/" & strUser & ",user")
PassExp=INT(objUser.MaxPasswordAge/86400)-INT(objUser.PasswordAge/86400)
If PassExp <0 Then
strPassMsg="Ihr Passwort läuft nie ab."
Else
strPassMsg="Passwort läuft ab in: " & vbCrLf & PassExp & " Tag(en)"
End If
PasswordExpires=strPassMsg
End Function
bei uns auf Win2008r2x64 für Win7Prox64 und x86 Clients funktionierte bis wenigen Wochen noch einwandfrei.
Seit dem, Jeder Clients, Benutzer Anmeldung, erhält die Code nur mit "Passwort läuft ab in: Tagen" obwohl Unter AC- Benutzer- Benutzer Eigenschaften- Kontooptionen auf "Passwort läuft nie ab" angehakt ist...
Hallo RobyTheHood,
du prüfst in deinem Code ja auch nicht auf das "Passwort läuft nie ab"-Flag. Dein Skript kann also so nicht konsistent sein. Deswegen wurde vermutlich auch das "On Error Resume Next" gesetzt.
Das siehst du oben in meinem Code unter:
Nimm zum Debugging das On Error Resume Next aus deinem Skript, dann bekommst du auch die entsprechende Fehlermeldung und Zeile angezeigt!
Grüße Uwe
du prüfst in deinem Code ja auch nicht auf das "Passwort läuft nie ab"-Flag. Dein Skript kann also so nicht konsistent sein. Deswegen wurde vermutlich auch das "On Error Resume Next" gesetzt.
Das siehst du oben in meinem Code unter:
If not intCurrentValue and ADS_UF_DONT_EXPIRE_PASSWD Then
funktionierte bis wenigen Wochen noch einwandfrei.
Das kann Zufall gewesen sein, prüft was Ihr in der Domäne verändert habt...Grüße Uwe