tomtombon
Goto Top

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 face-smile

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 face-smile, 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 face-smile


Kein heroisches Ziel, sondern eine praktische Erleichterung.
Für uns face-wink

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 face-smile

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 face-smile


Ja, ich muss zugeben das ich mir meine Skripte zusammen "klaue". face-smile
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...
face-smile


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 face-wink


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 face-smile 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.

Content-ID: 237659

Url: https://administrator.de/contentid/237659

Ausgedruckt am: 13.11.2024 um 08:11 Uhr

jsysde
jsysde 10.05.2014 um 12:15:56 Uhr
Goto Top
Mahlzeit.

Hui, ganz schöner Roman. face-wink
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
bastla
bastla 10.05.2014 aktualisiert um 16:48:32 Uhr
Goto Top
Hallo TomTomBon!

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"
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:
@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%  
Grüße
bastla
TomTomBon
TomTomBon 10.05.2014 um 19:49:07 Uhr
Goto Top
Leider nicht wirklich.

Da kommen wir in einen anderen Bereich der IT rein.
Und DER liegt in Indien.
Da haben wir zwar gute Kontakte hin, aber die sind erzkonservativ face-smile

Aber eine Möglichkeit die bei einem klarer strukturierten Unternehmen klappen wird ist das denke ich auf jeden Fall,

Danke!
TomTomBon
TomTomBon 10.05.2014 um 20:31:06 Uhr
Goto Top
Das muss ich nächste Woche mal testen.

Hört sich sehr interessant an.

Und ich hätte gleich ein paar Fragen face-wink

- Hast du quellen wo man sich etwas in VBS einlesen kann?
- ein paar Verständnis fragen zu deinem ersten Schnippsel:
for /f "tokens=4" %%i in ('net user %username% /domain^|findstr /bc:"Kennwort l"') do set "Datum=%%i"


for /f "tokens=4" %%i in ('net user %username% /domain

-> heißt für mich das eine for schleife gestartet wird, die den 4ten "satz" der net user Abfrage in die Variable i schreibt.

die interpretation passt nicht face-sad

^|findstr /bc:"Kennwort l"')
-> du übergibst das Ergebnis an findstr und läßt Kennwort läuft ab suchen

do set "Datum=%%i"
->du schreibst i in die Variable Datei
hat dies einen bestimmten Grund?
Oder nur der "optik" wegen?

Danke

Thomas D.
colinardo
Lösung colinardo 10.05.2014, aktualisiert am 11.05.2014 um 08:39:55 Uhr
Goto Top
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)
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
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.

back-to-topVBS/WSH Developer Referenzen und Tutorials findest du hier:

Grüße Uwe
bastla
Lösung bastla 10.05.2014 aktualisiert um 21:40:29 Uhr
Goto Top
Hallo TomTomBon!
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 Art
Kennwort läuft ab                   5/21/2014 7:46 AM
da vorweg die Ausgabe des "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
TomTomBon
TomTomBon 10.05.2014 um 21:34:16 Uhr
Goto Top
Mit Hilfe von Notepad++ verstehe ich das Skript sogar face-smile
Wie gesagt, schreiben kann ich die Skripte nicht wirklich.
Aber verstehen uns aus Bausteinen zusammenbauen.

Und ich würde sonst einfach Textdateien öffnen lassen face-wink
Mir doch egal wenn der AW sie ändert.
Ich will ihm HELFEN, nicht einschränken.

Danke Sehr!

Schönes Wochenende noch.

Mfg Thomas D
TomTomBon
TomTomBon 10.05.2014 um 21:40:04 Uhr
Goto Top
Gut dumm gefragt ist halb gelernt face-smile

Danke

Ich denke ich werde mir was nächste Woche zusammenschreiben können und in unserer Umgebung testen.

Ich werde das Ergebnis dann hier mal reinstellen.

Wie gesagt, die Texte sind nicht so wichtig.
Da gibt es eh immer unterschiedliche Vorlieben.

Jetzt werde ich eh nicht mehr testen da es sich im Lichte des Laptop Monitores so schlecht schreiben läßt face-wink

Thx
Thomas D
TomTomBon
TomTomBon 13.05.2014 aktualisiert um 16:02:30 Uhr
Goto Top
Also bisher klappt das gut.

Muss nur noch durchgetestet werden und angenommen werden.

Ich habe es mit VBS gemacht.
Und unsere Erneuerungszeiten sind unglaubliche 180 Tage.

Hier ist das Script (Ich habe auch eine Sprachabfrage eingebaut. Da muss ich noch etwas dran basteln face-smile )

':source:	[content:237659#922659]  
':source:	http://www.hardwareluxx.de/community/f24/vbscript-sprache-des-os-auslesen-745232.html  

On Error Resume Next

Const WARNDAYS = 10
Const erneuert = 179
'-------------------  
'-------------------  

Dim ObjWMI : Set ObjWMI = GetObject("winmgmts:\\.\root\CIMV2")  
PUBLIC LANGID
PUBLIC LANGLE

DIM colItems : Set colItems = ObjWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")  

For Each objItem in colitems
	LANGID = objItem.Locale 
Next

Select Case LANGID
	Case "0409" : LANGLE = "EN"	'English (United States)  
	Case "0407" : LANGLE = "DE"	'German (Standard)  
	

	End Select

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)
        
'		MsgBox "Your Language is: " & LANGID, vbExclamation  
		
		If LANGID = "0407" Then  
		
			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 ihr Windows Passwort rechtzeitig vor Ablauf am " & dateAblauf & " !" & vbNewline & vbNewline & "Bitte vergessen Sie anschließend nicht an ihrem Blackberry das Windows Passwort erneut einzugeben und ein neues Geräte Password zu vergeben.", vbExclamation   
			
			End If
	
			If intPWAlter < intMaxPwdAge and int(dateAblauf-now) >= erneuert then
				msgbox "ACHTUNG: Sie haben ihr Passwort geaendert!" & vbNewline & vbNewline & vbNewline & "Bitte vergessen Sie NICHT an ihrem Blackberry das Windows Passwort erneut einzugeben und ein neues Geräte Password zu vergeben!", vbExclamation   
			End If
		
		End If
		
		If LANGID = "0409" OR "0809" Then   
		
			If intPWAlter < intMaxPwdAge and int(dateAblauf-now) <= WARNDAYS then
				msgbox "ATTENTION: Your Password ended after " & int(dateAblauf-now) & " days." & vbNewline & "Please change your windows Logon Password until " & dateAblauf & " !" & vbNewline & vbNewline & "Be attend to change the Windows Password at the Blackberry and the Blackberry device Password.", vbExclamation   
			
			End If
	
			If intPWAlter < intMaxPwdAge and int(dateAblauf-now) >= erneuert then
				msgbox "ATTENTION: You has changed your Windows Password!" & vbNewline & vbNewline & vbNewline & "Do NOT forget to actualize the Windows Password and to change the Blackberry device Password!", vbExclamation   
			End If
		
		End If
		
	End If
	
End If
TomTomBon
TomTomBon 21.05.2014 aktualisiert um 13:51:15 Uhr
Goto Top
Das fertige Script, das noch immer nicht genehmigt ist.
Fürs Scharfschalten sotte Warndays natürlich NICHT so hoch gesetzt sein face-smile


':source:	[content:237659#922659]  
':source:	http://www.hardwareluxx.de/community/f24/vbscript-sprache-des-os-auslesen-745232.html  

' Author: Thomas Dethlefs	Thomas.Dethlefs@gmx.net   
' ver: 0.2  

On Error Resume Next

'Warndays= wieviele Tage vor ablauf Passwort warnt Script  
'erneuert= ERINNERT an erneuerung der Passworter auf dem BB  

Const WARNDAYS = 178
Const erneuert = 179
'-------------------  
'-------------------  

Dim ObjWMI : Set ObjWMI = GetObject("winmgmts:\\.\root\CIMV2")  
PUBLIC LANGID
PUBLIC LANGLE

DIM colItems : Set colItems = ObjWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")  

For Each objItem in colitems
	LANGID = objItem.Locale 
Next


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)
        
'		MsgBox "Your Language is: " & LANGID, vbExclamation  
		
		If LANGID = "0407" Then  
'Abfrage ob das OS auf deutsch ist. Dann DIESE Ausgabe:  
' INformation das PW Änderung ansteht:  
		
			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 ihr Windows Passwort rechtzeitig vor Ablauf am " & dateAblauf & " !" & vbNewline & vbNewline & "Bitte vergessen Sie anschließend nicht an ihrem Blackberry das Windows Passwort erneut einzugeben und ein neues Geräte Password zu vergeben.", vbExclamation   
			
			End If

' ERINNERUNG			  
			If intPWAlter < intMaxPwdAge and int(dateAblauf-now) >= erneuert then
				msgbox "ACHTUNG: Sie haben ihr Passwort geaendert!" & vbNewline & vbNewline & vbNewline & "Bitte vergessen Sie NICHT an ihrem Blackberry das Windows Passwort erneut einzugeben und ein neues Geräte Password zu vergeben!", vbExclamation   
			End If
		 
		Else 
'Bei JEDER anderen OS Sprache ausser Deutsch wird diese Englische Aussage als Text box ausgegeben:  
' INformation das PW Änderung ansteht:  

			If intPWAlter < intMaxPwdAge and int(dateAblauf-now) <= WARNDAYS then
				msgbox "ATTENTION: Your Password ended after " & int(dateAblauf-now) & " days." & vbNewline & "Please change your windows Logon Password until " & dateAblauf & " !" & vbNewline & vbNewline & "Be attend to change the Windows Password at the Blackberry and the Blackberry device Password.", vbExclamation   
			
			End If

' ERINNERUNG  
			
			If intPWAlter < intMaxPwdAge and int(dateAblauf-now) >= erneuert then
				msgbox "ATTENTION: You has changed your Windows Password!" & vbNewline & vbNewline & vbNewline & "Do NOT forget to actualize the Windows Password and to change the Blackberry device Password!", vbExclamation   
			End If
		 End If
		
	End If
	
End If
RobyTheHood
RobyTheHood 26.11.2015 um 14:18:46 Uhr
Goto Top
Hallo Zusammen,

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...
colinardo
colinardo 26.11.2015 aktualisiert um 15:32:53 Uhr
Goto Top
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:
If not intCurrentValue and ADS_UF_DONT_EXPIRE_PASSWD Then 
Nimm zum Debugging das On Error Resume Next aus deinem Skript, dann bekommst du auch die entsprechende Fehlermeldung und Zeile angezeigt!

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