
147057
22.12.2020
Hilfe gesucht bei Powershell Skript
Ich bin neu im Adminbereich und erst Recht was Powershell betrifft.
Ich bin zur Zeit an einem Skript dran, wo ich regelmäßig Mails an AD User verschicken möchte. Ich habe eine CSV Datei , wo ich die Spalten sAMAccountName und EMailVersand habe. Mein Problem ist, wenn ich die CSV wieder eingelesen habe, wie ich die Zeitdifferenz in Tagen des EMailVersandes zum jeweiligen Tagesdatum berechne. Das ich zunächst aus dem String ein Datum machen muss ist mir klar. Meine Suchmaschine hat mir die ParseExact Methode verraten, nur bekomme ich das trotzdem nicht gebacken. Ich hab folgendes zusammengebaut:
Selbst das funktioniert leider gar nicht. Kann mir hier jemand weiter helfen??
Ich bin zur Zeit an einem Skript dran, wo ich regelmäßig Mails an AD User verschicken möchte. Ich habe eine CSV Datei , wo ich die Spalten sAMAccountName und EMailVersand habe. Mein Problem ist, wenn ich die CSV wieder eingelesen habe, wie ich die Zeitdifferenz in Tagen des EMailVersandes zum jeweiligen Tagesdatum berechne. Das ich zunächst aus dem String ein Datum machen muss ist mir klar. Meine Suchmaschine hat mir die ParseExact Methode verraten, nur bekomme ich das trotzdem nicht gebacken. Ich hab folgendes zusammengebaut:
Import-Csv $StatusFile
$existingEntry = $UserFromCSV.Where({$_.sAMAccountName -eq $ADUser.SamAccountName})
if ($existingEntry.count -gt 0)
{
$LastReminderDays = ($Today-($existingEntry.EMailversand::[DateTime]::ParseExact)).Days
if ($LastReminderDays -gt 365)
{ write-host "Mail senden"
Selbst das funktioniert leider gar nicht. Kann mir hier jemand weiter helfen??
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 634264
Url: https://administrator.de/forum/hilfe-gesucht-bei-powershell-skript-634264.html
Ausgedruckt am: 17.05.2025 um 21:05 Uhr
8 Kommentare
Neuester Kommentar
Zitat von @aqui:
Vielleicht hilft das:
Powershell: S-MIME verschlüsselte und signierte E-Mail inkl. sicherem Anhang verschicken (Mailkit-Bibliothek)
Vielleicht hilft das:
Powershell: S-MIME verschlüsselte und signierte E-Mail inkl. sicherem Anhang verschicken (Mailkit-Bibliothek)
Sie möchte doch aber die Timespan berechnen und nicht SMIME machen oder sehe ich da was falsch?
Schau mal hier das könnte helfen
https://ss64.com/ps/new-timespan.html
da fehlt auch mindestens noch eine Schleife
Moin,
da stimmt so einiges nicht.
Nein, tut es nicht. Siehe unten
Das war eine gute Idee.
Bis hierhin sieht das ganz gut aus, so auf den ersten Blick. Aber nun geht es los.
Und wohin importierst Du das? In welche Variable? Richtig, in keine.
Aus dem $_ schließe ich, dass Du das Import-Csv auf das Pipen wolltest. Das tust Du aber nicht. Deshalb ist $_ auch leer. Ebenso leer ist auch $ADUser. Die Variable ist die lokale Variable aus Deiner for-each-Schleife. Die ist hier, wenn ich die Klammern richtig gezählt habe, aber nicht mehr gültig.
hth
Erik
da stimmt so einiges nicht.
Zitat von @147057:
In dem $existingEntry.EMailversand steht das Datum, wann ich die letzte Mail an den User verschickt habe.
In dem $existingEntry.EMailversand steht das Datum, wann ich die letzte Mail an den User verschickt habe.
Nein, tut es nicht. Siehe unten
Ich poste mal mein komplettes Skript, vielleicht fällt euch noch was anderes auf.
Das war eine gute Idee.
Import-Module -Name ActiveDirectory
>
> #Variablen
> $TodayTime = Get-Date
> $Today = Get-Date -UFormat '%d.%m.%Y'
> $WarningLevel = 365
> $UsersWithOldPasswordFromAD = New-Object -TypeName System.Collections.ArrayList
> $UsersWithOldPasswordFromFile = New-Object -TypeName System.Collections.ArrayList
> $FileArray = New-Object -TypeName System.Collections.ArrayList
>
> # PW Versandliste
> [String]$StatusFile = '//xxx.own/NETLOGON/Passwort.csv'
> If (!(Test-Path -Path ('{0}' -f $StatusFile))) {
> New-Item -Path '//xxx.own/NETLOGON' -Name 'Passwort.csv' -ItemType 'file'
> }
>
> #alle aktiven AD-User mit E-Mail-Adresse (außer Systembenutzer)
> $AllADUsers = Get-ADUser -Filter { Enabled -eq $True -and PasswordNeverExpires -eq $False -and Mail -like '*@xxx.*' } -Properties PasswordLastSet,Mail
>
> #Berechnung des Kennwortalters
> ForEach ($ADUser in $AllADUsers)
> {
> $NutzerName = $ADUser.SamAccountName
> $null = $ADUser.Mail
> $PasswordLastSet = $ADUser.PasswordLastSet
>
> # Wenn Benutzer von Admins in der AD erstellt wurden, und das Initial-Passwort vom Benutzer noch nicht geändert wurde, dann ist PasswordLastSet nicht gesetzt (NULL)
> # In diesem Fall, setzten wir PasswordLastSet auf Heute, damit die Berechnung "0" ergibt
> If(! $PasswordLastSet) {
> $PasswordLastSet = $TodayTime
> }
> $PasswordAge = ($TodayTime-$PasswordLastSet).Days
>
> if ($PasswordAge -ge $WarningLevel)
> {
> $UsersWithOldPasswordFromAD += [PSCustomObject]@{
> 'sAMAccountName' = $NutzerName
> 'EMailVersand' = $Today
> }
>
>
> }
> }
Bis hierhin sieht das ganz gut aus, so auf den ersten Blick. Aber nun geht es los.
#$UsersWithOldPasswordFromAD | Export-Csv -Path $StatusFile -NoTypeInformation
>
> Import-Csv $StatusFile
Und wohin importierst Du das? In welche Variable? Richtig, in keine.
$existingEntry = $UserFromCSV.Where({$_.sAMAccountName -eq $ADUser.SamAccountName})
Aus dem $_ schließe ich, dass Du das Import-Csv auf das Pipen wolltest. Das tust Du aber nicht. Deshalb ist $_ auch leer. Ebenso leer ist auch $ADUser. Die Variable ist die lokale Variable aus Deiner for-each-Schleife. Die ist hier, wenn ich die Klammern richtig gezählt habe, aber nicht mehr gültig.
hth
Erik
Moin,
Ja, das bezweifle ich ja gar nicht.
Das xxx steht für unsere Domäne. Aus Datenschutzgründen habe ich 3x x geschrieben
Und damit sollte ha auch das ganze nicht leer sein, was es ja auch nicht ist.
Ob Deine csv leer ist oder nicht, ist irrelevant. Du importierst sie nicht richtig in Dein Skript. Entweder muss vor dem import-csv eine Variable stehen, in der Du das Ergebnis speicherst oder nach dem Befehl eine Pipe auf den nächsten Befehl
<edit>
In Deinem Skript wäre das $UserFromCsv.
</edit>
oder
<edit>Ich sehe gerade, dass das bunt durcheinander geht.</edit>
hth
Erik
Ja, das bezweifle ich ja gar nicht.
>> # PW Versandliste
>>> [String]$StatusFile = '//xxx.own/NETLOGON/Passwort.csv'
>>> If (!(Test-Path -Path ('{0}' -f $StatusFile))) {
>>> New-Item -Path '//xxx.own/NETLOGON' -Name 'Passwort.csv' -ItemType 'file'
>>> }
Das xxx steht für unsere Domäne. Aus Datenschutzgründen habe ich 3x x geschrieben
Und damit sollte ha auch das ganze nicht leer sein, was es ja auch nicht ist.
Ob Deine csv leer ist oder nicht, ist irrelevant. Du importierst sie nicht richtig in Dein Skript. Entweder muss vor dem import-csv eine Variable stehen, in der Du das Ergebnis speicherst oder nach dem Befehl eine Pipe auf den nächsten Befehl
$StatusListEntries = import-csv $StatusFile
# Mach was mit $StatusListEntries
In Deinem Skript wäre das $UserFromCsv.
</edit>
oder
import-csv $StatusFile | #mach was mit $_
<edit>Ich sehe gerade, dass das bunt durcheinander geht.</edit>
hth
Erik