Veröffentlicht 29. März 20196 j Hallo, ich arbeite seit ein Paar tagen an einem Skript in PowerShell(kompletter Neuling) welches das Ablaufdatum der Passwörter(Windows) mit dem momentanen Datum vergleicht. Ich kann es jedoch nicht starten, da jedes mal folgende Fehlermeldung kommt: Fehler beim Aufrufen der Methode, da [System.DateTime] keine Methode mit dem Namen "substring" enthält. In C:\Users\MHE\Desktop\Unbenannt1.ps1:12 Zeichen:1 + $datum = $datum.substring(0,10) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound Und das auch bei der Funktion Split. Da ich Komplett neu bin habe ich keine Idee wie ich das fixen kann. Hier Das Programm: net user $env:username /DOMAIN | findstr /C:"Kennwort l" > $env:temp\expiry.txt # Ablaufdatum wird Aus Net user ausgelesen $ablaufdatum = (Get-Content $env:temp\expiry.txt) $ablaufdatum = $ablaufdatum.substring(36,10) $ablaufdatumtag = [int]$ablaufdatum.split(".")[0] $ablaufdatummonat = [int]$ablaufdatum.split(".")[1] $ablaufdatumjahr = [int]$ablaufdatum.split(".")[2] #Das extrahierte datum wird zurechtgeschnitten, aufgeteilt und in integer gewandelt $datum = Get-date -Format $datum $datum = $datum.substring(0,10) $datumtag = [int]$datum.split(".")[0] $datummonat = [int]$datum.split(".")[1] $datumjahr = [int]$datum.split(".")[2] #Das Momentane Datum wird zurechtgeschnitten, aufgeteilt und in integer gewandelt if($datumjahr -eq $ablaufdatumjahr) #Hier Wird nach dem Jahr geprüft { if($datummonat -ge $ablaufdatummonat) #Hier Wird nach dem Monat Geprüft { if($datumtag -ge $ablaufdatumtag) #Hier Wird nach dem Tag Geprüft { msg $env:username Passwort muss Zurückgesetzt werden } elseif($datumtag + 5 -eq $ablaufdatumtag) #Erinnerung 5 Tage vor den Ablaufdatum { if($datumtag -lt $ablaufdatumtag) { msg $env:username Passwort muss Zurückgesetzt werden } } } } { if($datummonat + 5 -ge $ablaufdatummonat) { msg $env:username Passwort muss Zurückgesetzt werden } else { Exit 0 } } Über Hilfe würde ich mich sehr freuen!! Danke im Vorraus, Merlin Bearbeitet 29. März 20196 j von merlin20302 vergessener Apell
29. März 20196 j Achte auf die Groß- und Kleinschreibung. Mit $datum.substring(0,10) bekommst du den Fehler, mit $datum.Substring(0,10) klappt es. Das gleiche mit Split.
29. März 20196 j Autor Klappt immer noch nicht aber Danke Für die Antwort. Habe vergessen zu erwähnen, dass dies nur beim $datum und nicht beim $ablaufdatum Passiert
29. März 20196 j vor 3 Minuten schrieb merlin20302: Klappt immer noch nicht aber Danke Für die Antwort. Der gleiche Fehler wirds aber nicht sein, $datum = Get-date -Format $datum $datum = $datum.Substring(0,10) echo $datum gibt das Datum im US-Format zurück. (03.29.2019)
29. März 20196 j Der Unterschied ist, $ablaufdatum ist ein String $datum ist aber ein DateTime Objekt. $datum = GetDate -Format $datum sieht auch nicht so aus als wäre $datum vorher definiert $datum = (Get-Date -Format 'dd.MM.yyyy').ToString() oder $datum = (Get-Date).ToString("yyyy.MM.dd") dann funktioniert das mit Substring $datum = Get-date -Format $datum $datum = $datum.Substring(0,10) echo $datum wirft bei mir den gleichen Fehler für substring und das echo liefert dann "Freitag, 29. März 2019 09:59:13" zum Thema Ablaufdatum noch: Du kannst dir den Umweg über "net user ..." sparen $ablaufdatum = (Get-AdUser <accountName> -Properties AccountExpirationDate |select -expand AccountExpirationDate).ToString('dd.MM.yyyy')
29. März 20196 j Das schaut bei dir irgendwie... kompliziert aus. Ich habe mir vor Jahren ein Skript gebastelt, das meine User ab 14 Tage vor Ablauf per Mail benachrichtigt, da schaut der Teil mit Dem Datum so aus: # Ablaufdatum = Zeitpunkt des letzten Passworänderung - Maximales Passwortalter $ExpiryDate=$_.PasswordLastSet + (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge # Aktuelles Datum abholen $today=get-date # Restliche Laufzeit = Ablaufdatum (als Datum) - Heutiges Datum (als Datum) $DaysLeft=$ExpiryDate - $today (Ja, ich kommentiere jeden Mist, damit ich später auch noch weiß was ich verbrochen habe ) Einziger Nachteil den ich bis jetzt feststellen konnte: BA-Studenten die länger abwesend sind bekommen auch nach Ablauf noch die Mails - mit negativen Tagen. Da sich aber noch keiner beschwert hat, lass ich das so. Bearbeitet 29. März 20196 j von Maniska
29. März 20196 j @Maniska ja viel besser. Einziges Problem wären user die per GPO eine andere Passwortrichtlinie haben. vor 11 Minuten schrieb Maniska: nach Ablauf noch die Mails könnte man ja mit PasswordExpired rausfiltern.
29. März 20196 j In Komplett schaut das Ganze bei mir so aus: # AD Modul aktivieren Import-Module ActiveDirectory # Filtern nach Accounts die aktiv sind und deren Kennwort ablaufen kann # Auslesen der benötigten Attribute aus dem AD # Festlegen welche OUs durchsucht werden sollen # ForEach Cmdlet, nicht die Schleife! Get-ADUser -filter {(Enabled -eq $True) -and (PasswordNeverExpires -eq $false)} -properties PasswordLastSet,EmailAddress,GivenName,Surname -SearchBase "OU=XXX,OU=XXX,DC=domain,DC=local" -SearchScope Subtree | ForEach { # Ablaufdatum = Zeitpunkt des letzten Passworänderung - Maximales Passwortalter $ExpiryDate=$_.PasswordLastSet + (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge # Aktuelles Datum abholen $today=get-date # Restliche Laufzeit = Ablaufdatum (als Datum) - Heutiges Datum (als Datum) $DaysLeft=$ExpiryDate - $today # Setzen der Variablen, die im Mailtext verwendet werden # Übrige Tage als Anzahl Tage (.days) # Automatische Variablen $_.xxx in lokale Variable schreiben, sonst wird es unschön im Mailtext $display=$daysleft.days $UserName=$_.GivenName $SurName=$_.Surname #Wenn Anzahl verbliebener Tage <14 if ($display -lt 15) { #Nachrichtentext als Here-String @"..."@ abspeichern $MyVariable = @" Hallo $UserName $SurName, Ihr Kennwort wird in $display Tagen ablaufen, bitte denken Sie daran das Kennwort rechtzeitig zu aendern! Um das Kennwort zu aendern, druecken Sie bitte "STRG + ALT + ENTF" und waehlen Sie die Option "Kennwort aendern" An die Kollegen mit mobilen Endgeraeten (iPhone, iPad): Denkt bitte daran, dass ihr auch dort die Passwoerter aendern muesst! Mit freundlichem Gruss, Die IT "@ # Nachricht verschicken send-mailmessage -to $_.EmailAddress -from Kennwortwarnung@domain.local -Subject "Achtung! Ihr Kennwort wird in $display Tagen ablaufen" -body $MyVariable -smtpserver relay.domain.local -encoding ([System.Text.Encoding]::UTF8) } }
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.