147057
Goto Top

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:

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??

Content-Key: 634264

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

Ausgedruckt am: 29.03.2024 um 01:03 Uhr

Mitglied: aqui
aqui 22.12.2020 aktualisiert um 14:56:49 Uhr
Goto Top
Mitglied: LeeX01
LeeX01 22.12.2020 aktualisiert um 14:45:45 Uhr
Goto Top

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
Mitglied: emeriks
emeriks 22.12.2020 um 14:42:47 Uhr
Goto Top
Hi,
was steht denn in
$existingEntry.EMailversand
drin? Wenn es ein gängiger Datumsstring ist, dann reicht wahrscheinlich schon das:
$LastReminderDays =  ($Today-(Get-Date($existingEntry.EMailversand)).Days

E.
Mitglied: 147057
147057 22.12.2020 um 15:02:53 Uhr
Goto Top
In dem $existingEntry.EMailversand steht das Datum, wann ich die letzte Mail an den User verschickt habe. Mein Hauptanliegen ist, dass ich aus dem AD die User auslese, dessen PW älter als 1 Jahr ist, die sollen dann eine Mail bekommen, mit der Bitte um Änderung, da nach dem neuen BSI -Kompendium das Passwort nicht mehr regelmäßig geändert werden soll/ muss.
Das Auslesen klappt gut. Wer neu auf die Liste kommt soll gleich eine Mail bekommen, ansonsten will ich schauen, wann die letzte Mail verschickt wurde. Darum brauchte ich die Berechnung. Danke an emeriks.
Nur überschreibt er mir immer noch das Datum in der CSV, obwohl es nicht älter als 1 Jahr ist.

Ich poste mal mein komplettes Skript, vielleicht fällt euch noch was anderes auf.

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  
    }
     

}
}

 
#$UsersWithOldPasswordFromAD | Export-Csv -Path $StatusFile -NoTypeInformation 

Import-Csv $StatusFile
$existingEntry = $UserFromCSV.Where({$_.sAMAccountName -eq $ADUser.SamAccountName})

if ($existingEntry.count -gt 0)
    {
       $LastReminderDays =  ($Today-(Get-Date($existingEntry.EMailversand)).Days)
       if ($LastReminderDays -gt $WarningLevel)
       { $UsersWithOldPasswordFromAD += [PSCustomObject]@{
         'EMailVersand' = Get-Date -UFormat '%d.%m.%Y'  
        }
        }
        }
        
else {$UsersWithOldPasswordFromAD += [PSCustomObject]@{
      	'sAMAccountName' = $NutzerName  
        
    }
    
    }
            
$UsersWithOldPasswordFromAD | Export-Csv -Path $StatusFile -NoTypeInformation
     
Mitglied: erikro
erikro 22.12.2020 aktualisiert um 16:39:48 Uhr
Goto Top
Moin,

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.

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

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
Mitglied: 147057
147057 23.12.2020 um 08:11:49 Uhr
Goto Top
Zitat von @erikro:

Moin,

da stimmt so einiges nicht.



Meine CSV ist oben definiert:

>> # 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.
Mitglied: 147057
147057 23.12.2020 um 08:47:06 Uhr
Goto Top
Doch sie ist leer, aber warum??
Mitglied: erikro
erikro 23.12.2020 aktualisiert um 18:00:38 Uhr
Goto Top
Moin,

Zitat von @147057:

Zitat von @erikro:

Moin,

da stimmt so einiges nicht.



Meine CSV ist oben definiert:

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
<edit>
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