gabebu
Goto Top

Powershell: Nutzer in CSV Exportieren, wenn er vor einem bestimmten Datum eingeloggt hat

Hallo Zusammen

Ich bin gerade dabei ein kurzes Script zu schreiben, dass alle Nutzer aus exchange online exportieren soll, die vor einem bestimmten Datum sich eingeloggt haben. Hier ist das besagte Script:
#Date
[datetime]$LastDate = Read-Host "Enter the date for reference (dd/mm/yyyy hh:mm)"  


$Userdata = (Get-Mailbox) | Foreach {Get-MailboxStatistics $_.Identity | Select DisplayName, LastLogonTime

Write-Host $_.Identity "Has been checked."  
#Write user to CSV-File, if the user hasn't been logged into the system in the given time. 
If ( $Userdata.LastLogonTime -lt $LastDate)
{ 
    $Userdata | Export-CSV 'C:\Users\gbu101\OneDrive - Winterthur Gas & Diesel Ltd\Documents\export_users.csv'  
    Write-Host "Users being exported"  
}

}

Die Exportierung funktioniert, aber der Datumsvergleich leider nicht. Er exportiert einfach immer alle Nutzer, egal was ich angebe.Meine Vermutung liegt darin, dass ich das Datum von $Userdata zuerst in das DateTime Format umwandeln muss, da bin ich mir aber auch nicht ganz sicher...

Wo genau liegt hier der Fehler?


Besten Dank für eure Hilfe.


Gruss,


gabe

Content-ID: 602658

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

Ausgedruckt am: 25.11.2024 um 19:11 Uhr

145916
Lösung 145916 07.09.2020 aktualisiert um 16:09:06 Uhr
Goto Top
Meine Vermutung liegt darin, dass ich das Datum von $Userdata zuerst in das DateTime Format umwandeln muss
Nein, guckst du die Property ist schon im entsprechenden Format
LastLogonTime           Property   System.Nullable[datetime] LastLogonTime {get;}        
Dein Fehler liegt beim Erstellen des Datums das du vom User einliest, denn per Default ohne weitere Culture-Angabe verwendet die PS hier bei direkter Zuweisung eines Strings nicht die deutsche Datumsformatumwandlung sondern die Englische:

Außerdem hast du einen Fehler beim Export, du exportierst quasi nur den letzten User weil du die Datei immer wieder mit nur einem User überschreibst face-smile.

$time = [datetime]::MinValue
if ([datetime]::TryParse((Read-Host "Enter the date for reference (dd/mm/yyyy hh:mm)"),[cultureinfo]::GetCultureInfo('de'),'None',[ref]$time)){  
    Get-Mailbox -ResultSize unlimited | Get-MailboxStatistics | ?{$_.LastLogonTime -lt $time} | select DisplayName,LastLogonTime | export-csv .\data.csv -Delimiter ";" -NoTypeInformation -Encoding UTF8  
}else{
    write-error "Datum ist im falschen Format!"  
}
gabeBU
gabeBU 07.09.2020 um 17:13:11 Uhr
Goto Top
Okay, also das Datumformat wurde mir eigentlich bei beiden Werten im deutschen Format ausgegeben worden, aber danke für die Info.

Ich werde es morgen gleich testen. Nur zur Verständigung: was nimmt er hier als MinValue?


Gruss,


GabeBU
mbehrens
mbehrens 07.09.2020 um 17:37:45 Uhr
Goto Top
Zitat von @gabeBU:

Ich bin gerade dabei ein kurzes Script zu schreiben, dass alle Nutzer aus exchange online exportieren soll, die vor einem bestimmten Datum sich eingeloggt haben. Hier ist das besagte Script:

[...]

Die Exportierung funktioniert, aber der Datumsvergleich leider nicht. Er exportiert einfach immer alle Nutzer, egal was ich angebe.Meine Vermutung liegt darin, dass ich das Datum von $Userdata zuerst in das DateTime Format umwandeln muss, da bin ich mir aber auch nicht ganz sicher...

Wo genau liegt hier der Fehler?

U. a. daran, dass LastLoginTime schon seit einigen Versionen deprecated ist. Ein Ansatz könnte die Benutzung von Search-UnifiedAuditLog sein.
145916
145916 07.09.2020 aktualisiert um 18:03:24 Uhr
Goto Top
Nur zur Verständigung: was nimmt er hier als MinValue?
[datetime]::MinValue == Montag, 1. Januar 0001 00:00:00

Nachschlagen darfst du das auch gerne
https://docs.microsoft.com/de-de/dotnet/api/system.datetime.minvalue?vie ...
erikro
erikro 07.09.2020 um 18:15:54 Uhr
Goto Top
Moin,

works as designed:


Zitat von @gabeBU:
> #Date
> [datetime]$LastDate = Read-Host "Enter the date for reference (dd/mm/yyyy hh:mm)"  
> 
> 
> $Userdata = (Get-Mailbox) | Foreach {Get-MailboxStatistics $_.Identity | Select DisplayName, LastLogonTime
> 

# Hier schreibst Du das Ergebnis in das Array $userdata und pipest es auf foreach. Ich würde
# da immer eine Schleife bevorzugen, weil das performanter ist. Aber gut. Es geht auch so.

> Write-Host $_.Identity "Has been checked."  

# Hier benutzt Du korrekt die Variable $_, um das gepipete Objekt aus dem Array anzusprechen

> #Write user to CSV-File, if the user hasn't been logged into the system in the given time. 
> If ( $Userdata.LastLogonTime -lt $LastDate)

# Und ab hier nimmst Du das ganze Array, das keine Eigenschaft .LastLogonTime hat. 

> { 
>     $Userdata | Export-CSV 'C:\Users\gbu101\OneDrive - Winterthur Gas & Diesel Ltd\Documents\export_users.csv'  
>     Write-Host "Users being exported"  
> }

# Naja, da das Objekt keine Eigenschaft hat, gibt es $null aus. Und $null ist kleiner als alles andere. Das ist
# sogar afaik kleiner als negative Werte. Also gibt er das ganze Objekt-Array aus.

> 
> }

hth

Erik
gabeBU
gabeBU 08.09.2020 um 09:12:01 Uhr
Goto Top
Zitat von @erikro:

Moin,

works as designed:


Zitat von @gabeBU:
>> #Date
>> [datetime]$LastDate = Read-Host "Enter the date for reference (dd/mm/yyyy hh:mm)"  
>> 
>> 
>> $Userdata = (Get-Mailbox) | Foreach {Get-MailboxStatistics $_.Identity | Select DisplayName, LastLogonTime
>> 
> 
> # Hier schreibst Du das Ergebnis in das Array $userdata und pipest es auf foreach. Ich würde
> # da immer eine Schleife bevorzugen, weil das performanter ist. Aber gut. Es geht auch so.
> 
>> Write-Host $_.Identity "Has been checked."  
> 
> # Hier benutzt Du korrekt die Variable $_, um das gepipete Objekt aus dem Array anzusprechen
> 
>> #Write user to CSV-File, if the user hasn't been logged into the system in the given time. 
>> If ( $Userdata.LastLogonTime -lt $LastDate)
> 
> # Und ab hier nimmst Du das ganze Array, das keine Eigenschaft .LastLogonTime hat. 
> 
>> { 
>>     $Userdata | Export-CSV 'C:\Users\gbu101\OneDrive - Winterthur Gas & Diesel Ltd\Documents\export_users.csv'  
>>     Write-Host "Users being exported"  
>> }
> 
> # Naja, da das Objekt keine Eigenschaft hat, gibt es $null aus. Und $null ist kleiner als alles andere. Das ist
> # sogar afaik kleiner als negative Werte. Also gibt er das ganze Objekt-Array aus.
> 
>> 
>> }

hth

Erik


Leider funktioniert es bei mir nicht korrekt, es gibt die folgende Fehlermeldung aus:

Export-Csv : Cannot bind argument to parameter 'InputObject' because it is null.  
At C:\Ex_Powershell\Exchange_Connector.ps1:34 char:18
+ ... $Userdata | Export-CSV 'C:\Users\gbu101\OneDrive - Winterthur Gas & D ...  
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Export-Csv], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ExportCsvCommand
gabeBU
gabeBU 08.09.2020 um 09:55:36 Uhr
Goto Top
$time = [datetime]::MinValue
if ([datetime]::TryParse((Read-Host "Enter the date for reference (dd/mm/yyyy hh:mm)"),[cultureinfo]::GetCultureInfo('de'),'None',[ref]$time)){  
    Get-Mailbox -ResultSize unlimited | Get-MailboxStatistics | ?{$_.LastLogonTime -lt $time} | select DisplayName,LastLogonTime | export-csv .\data.csv -Delimiter ";" -NoTypeInformation -Encoding UTF8  
}else{
    write-error "Datum ist im falschen Format!"  
}


Das geht dafür, vielen dank!