Benutzer mit den meisten Antworten
Brauche Hilfe bei Powershell Script

Frage
-
Hallo zusammen
Ich habe ein kleines Problem.
Ich bin ein kleines Script am schreiben welches automatisch eine E-Mail an jeden User aus einer Liste verschickt.
Jetzt bin ich mit dem Script schon so weit, dass ich die Liste der User habe und auch den Script-Teil welcher mir automatisch die Email-Adresse des jeweiligen Users ausgibt.Jetzt bin ich aber ratlos, wie ich die beiden Script-teile verbinden kann:
#Leider riesiger Teil der die User aus einem Verzeichnis herausfiltert und in die Liste schreibt
Param ( [string]$Path = "N:\", [string]$ReportPath = "N:\Test\report.csv", [switch]$Recurse ) Function AddObject { Param ( $FileObject ) $FileObject $Size = [double]($FSO.GetFolder($FileObject.FullName).Size) $Script:TotSize += $Size # Got rid of the code that converted $Size from a double to a String here $Script:Report += New-Object PSObject -Property @{ FolderName = $FileObject.FullName CreatedOn = $FileObject.CreationTime LastUpdated = $FileObject.LastWriteTime Size = $Size Owner = (Get-Acl $FileObject.FullName).Owner } } Function CalculateSize { Param ( [double]$Size ) If ($Size -gt 1000000) { $ReturnSize = ($Size / 1GB) } Else { $ReturnSize = ($Size / 1MB) } Return $ReturnSize } Function Set-AlternatingRows { [CmdletBinding()] Param( [Parameter(Mandatory=$True,ValueFromPipeline=$True)] [object[]]$Lines, [Parameter(Mandatory=$True)] [string]$CSSEvenClass, [Parameter(Mandatory=$True)] [string]$CSSOddClass ) Begin { $ClassName = $CSSEvenClass } Process { ForEach ($Line in $Lines) { $Line = $Line.Replace("<tr>","<tr class=""$ClassName"">") If ($ClassName -eq $CSSEvenClass) { $ClassName = $CSSOddClass } Else { $ClassName = $CSSEvenClass } Return $Line } } } cls $Report = @() $TotSize = 0 $FSO = New-Object -ComObject Scripting.FileSystemObject #First get the properties of the starting path $Root = Get-Item -Path $Path AddObject $Root #Now loop through all the subfolders $ParamSplat = @{ Path = $Path Recurse = $Recurse } ForEach ($Folder in (Get-ChildItem @ParamSplat | Where { $_.PSisContainer })) { AddObject $Folder } $Report = $Report | select-object("Size" ,"FolderName" ,"Owner", "LastUpdated") $Limit = (Get-Date).AddDays(-30) $Report = $Report | Where-Object { $_.Size -gt 5000} | Where {$_.LastUpdated -gt "$Limit"} | Export-csv N:\Test\Report.csv # Csv Dateien einlesen $Csv = Import-Csv N:\Service_Desk_Bereinigung\Whitelist_Mail.csv $Report = Import-Csv N:\Test\Report.csv # identische kopie von Report erstellen $Report_2 = [System.Collections.ArrayList]@($Report) # alle elemente von CSV zum vergleichen durchlaufen ForEach($CsvRow in $Csv) { # alle elemente von Report durchlaufen und vergleichen ForEach($ReportRow in $Report){ # Report Foldername mit Csv Foldername vergleichen If($ReportRow.Foldername -eq $CsvRow.Foldername){ # wenn der Foldername gleich ist wird das Element von der Report kopie entfernt $Report_2.Remove($ReportRow) } } } $Owner = $Report_2 | select ("Owner") $Size = $Report_2 | Select ("Size") $Path = $Report_2 | Select ("FolderName") $Owner | foreach-object{ $Owner = $Owner -replace "Owner=Main", "" $Owner = $Owner -replace "Owner=BUILTIN\\Administrators", "HOFDO" $Owner = $Owner -replace "\\", "" }
#Teil welcher die E-mail aussucht.
$search=[adsisearcher]"mailnickname=$Owner" $search.PageSize = 100 $search.PropertiesToLoad.add("mail") $search.PropertiesToLoad.add("displayname") $search.findall() | % { "path"+$_.path "Displayname"+$_.properties.displayame $Mail = $_.properties.mail $Mail }
Wenn mit jemand helfen könnte, indem er mal darüberschaut, wäre ich sehr erfreut.
P.S: Ich bin noch ziemlich ein Anfänger also habt bitte ein bisschen erbarmen mit mir.
Dominique Hofmann
Antworten
-
Hallo Dominique,
ich denke, der Parameter -Username ist Null oder falsch, den du der Funktion Search-User übergibst. Dann ist der Suchfilter ungültig und natürlich die Properties leer... Setz mal einen Breakpoint auf Zeile 78 und schau dir den Inhalt der Variable $Username an...
Grüsse
Florian
Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...
- Bearbeitet Florian Reck Dienstag, 14. Januar 2014 11:27
- Als Antwort vorgeschlagen Alex Pitulice Freitag, 17. Januar 2014 09:39
- Als Antwort markiert Alex Pitulice Dienstag, 21. Januar 2014 08:43
-
Ja der Fehler sagt aus, das der Username leer ist!
Ich habe das mit einem IF() abgefangen.
Param ( [string]$Path = "N:\", [string]$ReportPath = "N:\Test\report.csv", [switch]$Recurse ) Function AddObject { Param ( $FileObject ) $FileObject $Size = [double]($FSO.GetFolder($FileObject.FullName).Size) $Script:TotSize += $Size # Got rid of the code that converted $Size from a double to a String here $Script:Report += New-Object PSObject -Property @{ FolderName = $FileObject.FullName CreatedOn = $FileObject.CreationTime LastUpdated = $FileObject.LastWriteTime Size = $Size Owner = (Get-Acl $FileObject.FullName).Owner } } Function CalculateSize { Param ( [double]$Size ) If ($Size -gt 1000000) { $ReturnSize = ($Size / 1GB) } Else { $ReturnSize = ($Size / 1MB) } Return $ReturnSize } Function Set-AlternatingRows { [CmdletBinding()] Param( [Parameter(Mandatory=$True,ValueFromPipeline=$True)] [object[]]$Lines, [Parameter(Mandatory=$True)] [string]$CSSEvenClass, [Parameter(Mandatory=$True)] [string]$CSSOddClass ) Begin { $ClassName = $CSSEvenClass } Process { ForEach ($Line in $Lines) { $Line = $Line.Replace("<tr>","<tr class=""$ClassName"">") If ($ClassName -eq $CSSEvenClass) { $ClassName = $CSSOddClass } Else { $ClassName = $CSSEvenClass } Return $Line } } } Function Search-User { param( [Parameter(Mandatory=$True)] [ValidateNotNullOrEmpty()] [String]$Username ) $search=[adsisearcher]"name=$Username" $Null = $search.PropertiesToLoad.add("mailnickname") $Null = $search.PropertiesToLoad.add("mail") $Null = $search.PropertiesToLoad.add("displayname") $Found = $search.findone() New-object -TypeName PSObject -Property $Found.Properties } cls $Report = @() $TotSize = 0 $FSO = New-Object -ComObject Scripting.FileSystemObject #First get the properties of the starting path $Root = Get-Item -Path $Path AddObject $Root #Now loop through all the subfolders $ParamSplat = @{ Path = $Path Recurse = $Recurse } ForEach ($Folder in (Get-ChildItem @ParamSplat | Where { $_.PSisContainer })) { AddObject $Folder } $Report = $Report | select-object("Size" ,"FolderName" ,"Owner", "LastUpdated") $Limit = (Get-Date).AddDays(-30) $Report = $Report | Where-Object { $_.Size -gt 5000} | Where {$_.LastUpdated -gt "$Limit"} | Export-csv N:\Test\Report.csv # Csv Dateien einlesen $Csv = Import-Csv N:\Service_Desk_Bereinigung\Whitelist_Mail.csv $Report = Import-Csv N:\Test\Report.csv # identische kopie von Report erstellen $Report_2 = [System.Collections.ArrayList]@($Report) # alle elemente von CSV zum vergleichen durchlaufen ForEach($CsvRow in $Csv) { # alle elemente von Report durchlaufen und vergleichen ForEach($ReportRow in $Report){ # Report Foldername mit Csv Foldername vergleichen If($ReportRow.Foldername -eq $CsvRow.Foldername){ # wenn der Foldername gleich ist wird das Element von der Report kopie entfernt $Report_2.Remove($ReportRow) } } } ForEach($Item in $Report2) { $Username = (($Item.Owner -split '\\')[1]) If (-Not ([String]::IsNullOrEmpty($Username))) { Write-Host "Ich bearbeite nun den User: $Username" Search-User -Username (($Item.Owner -split '\\')[1]) } Else { Write-Host "Username war leer!" } }
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Bearbeitet Peter Kriegel Dienstag, 14. Januar 2014 11:40
- Als Antwort vorgeschlagen Alex Pitulice Freitag, 17. Januar 2014 09:39
- Als Antwort markiert Alex Pitulice Dienstag, 21. Januar 2014 08:43
Alle Antworten
-
So ungefähr ?
Param ( [string]$Path = "N:\", [string]$ReportPath = "N:\Test\report.csv", [switch]$Recurse ) Function AddObject { Param ( $FileObject ) $FileObject $Size = [double]($FSO.GetFolder($FileObject.FullName).Size) $Script:TotSize += $Size # Got rid of the code that converted $Size from a double to a String here $Script:Report += New-Object PSObject -Property @{ FolderName = $FileObject.FullName CreatedOn = $FileObject.CreationTime LastUpdated = $FileObject.LastWriteTime Size = $Size Owner = (Get-Acl $FileObject.FullName).Owner } } Function CalculateSize { Param ( [double]$Size ) If ($Size -gt 1000000) { $ReturnSize = ($Size / 1GB) } Else { $ReturnSize = ($Size / 1MB) } Return $ReturnSize } Function Set-AlternatingRows { [CmdletBinding()] Param( [Parameter(Mandatory=$True,ValueFromPipeline=$True)] [object[]]$Lines, [Parameter(Mandatory=$True)] [string]$CSSEvenClass, [Parameter(Mandatory=$True)] [string]$CSSOddClass ) Begin { $ClassName = $CSSEvenClass } Process { ForEach ($Line in $Lines) { $Line = $Line.Replace("<tr>","<tr class=""$ClassName"">") If ($ClassName -eq $CSSEvenClass) { $ClassName = $CSSOddClass } Else { $ClassName = $CSSEvenClass } Return $Line } } } Function Search-User { param( $Username ) $search=[adsisearcher]"name=$Username" $search.PropertiesToLoad.add("mailnickname") $search.PropertiesToLoad.add("mail") $search.PropertiesToLoad.add("displayname") $Found = $search.findone() New-object -TypeName PSObject -Property $Found.Properties } cls $Report = @() $TotSize = 0 $FSO = New-Object -ComObject Scripting.FileSystemObject #First get the properties of the starting path $Root = Get-Item -Path $Path AddObject $Root #Now loop through all the subfolders $ParamSplat = @{ Path = $Path Recurse = $Recurse } ForEach ($Folder in (Get-ChildItem @ParamSplat | Where { $_.PSisContainer })) { AddObject $Folder } $Report = $Report | select-object("Size" ,"FolderName" ,"Owner", "LastUpdated") $Limit = (Get-Date).AddDays(-30) $Report = $Report | Where-Object { $_.Size -gt 5000} | Where {$_.LastUpdated -gt "$Limit"} | Export-csv N:\Test\Report.csv # Csv Dateien einlesen $Csv = Import-Csv N:\Service_Desk_Bereinigung\Whitelist_Mail.csv $Report = Import-Csv N:\Test\Report.csv # identische kopie von Report erstellen $Report_2 = [System.Collections.ArrayList]@($Report) # alle elemente von CSV zum vergleichen durchlaufen ForEach($CsvRow in $Csv) { # alle elemente von Report durchlaufen und vergleichen ForEach($ReportRow in $Report){ # Report Foldername mit Csv Foldername vergleichen If($ReportRow.Foldername -eq $CsvRow.Foldername){ # wenn der Foldername gleich ist wird das Element von der Report kopie entfernt $Report_2.Remove($ReportRow) } } } ForEach($Item in $Report2) { Search-User -Username (($Item.Owner -split '\\')[1]) }
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort vorgeschlagen Alex Pitulice Mittwoch, 8. Januar 2014 13:16
- Nicht als Antwort vorgeschlagen Alex Pitulice Freitag, 17. Januar 2014 09:40
-
Hallo Dominique ,
wenn die Thematik geklärt ist, markiere bitte den Beitrag von Peter "als Antwort".
Viele Grüße,
AlexAlex Pitulice, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo Dominique!
Kopiere die Fehlermeldung bitte als Text hier hinein. Das Bild ist nicht zu erkennen!
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+ -
Hallo Dominique,
ich denke, der Parameter -Username ist Null oder falsch, den du der Funktion Search-User übergibst. Dann ist der Suchfilter ungültig und natürlich die Properties leer... Setz mal einen Breakpoint auf Zeile 78 und schau dir den Inhalt der Variable $Username an...
Grüsse
Florian
Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...
- Bearbeitet Florian Reck Dienstag, 14. Januar 2014 11:27
- Als Antwort vorgeschlagen Alex Pitulice Freitag, 17. Januar 2014 09:39
- Als Antwort markiert Alex Pitulice Dienstag, 21. Januar 2014 08:43
-
Ja der Fehler sagt aus, das der Username leer ist!
Ich habe das mit einem IF() abgefangen.
Param ( [string]$Path = "N:\", [string]$ReportPath = "N:\Test\report.csv", [switch]$Recurse ) Function AddObject { Param ( $FileObject ) $FileObject $Size = [double]($FSO.GetFolder($FileObject.FullName).Size) $Script:TotSize += $Size # Got rid of the code that converted $Size from a double to a String here $Script:Report += New-Object PSObject -Property @{ FolderName = $FileObject.FullName CreatedOn = $FileObject.CreationTime LastUpdated = $FileObject.LastWriteTime Size = $Size Owner = (Get-Acl $FileObject.FullName).Owner } } Function CalculateSize { Param ( [double]$Size ) If ($Size -gt 1000000) { $ReturnSize = ($Size / 1GB) } Else { $ReturnSize = ($Size / 1MB) } Return $ReturnSize } Function Set-AlternatingRows { [CmdletBinding()] Param( [Parameter(Mandatory=$True,ValueFromPipeline=$True)] [object[]]$Lines, [Parameter(Mandatory=$True)] [string]$CSSEvenClass, [Parameter(Mandatory=$True)] [string]$CSSOddClass ) Begin { $ClassName = $CSSEvenClass } Process { ForEach ($Line in $Lines) { $Line = $Line.Replace("<tr>","<tr class=""$ClassName"">") If ($ClassName -eq $CSSEvenClass) { $ClassName = $CSSOddClass } Else { $ClassName = $CSSEvenClass } Return $Line } } } Function Search-User { param( [Parameter(Mandatory=$True)] [ValidateNotNullOrEmpty()] [String]$Username ) $search=[adsisearcher]"name=$Username" $Null = $search.PropertiesToLoad.add("mailnickname") $Null = $search.PropertiesToLoad.add("mail") $Null = $search.PropertiesToLoad.add("displayname") $Found = $search.findone() New-object -TypeName PSObject -Property $Found.Properties } cls $Report = @() $TotSize = 0 $FSO = New-Object -ComObject Scripting.FileSystemObject #First get the properties of the starting path $Root = Get-Item -Path $Path AddObject $Root #Now loop through all the subfolders $ParamSplat = @{ Path = $Path Recurse = $Recurse } ForEach ($Folder in (Get-ChildItem @ParamSplat | Where { $_.PSisContainer })) { AddObject $Folder } $Report = $Report | select-object("Size" ,"FolderName" ,"Owner", "LastUpdated") $Limit = (Get-Date).AddDays(-30) $Report = $Report | Where-Object { $_.Size -gt 5000} | Where {$_.LastUpdated -gt "$Limit"} | Export-csv N:\Test\Report.csv # Csv Dateien einlesen $Csv = Import-Csv N:\Service_Desk_Bereinigung\Whitelist_Mail.csv $Report = Import-Csv N:\Test\Report.csv # identische kopie von Report erstellen $Report_2 = [System.Collections.ArrayList]@($Report) # alle elemente von CSV zum vergleichen durchlaufen ForEach($CsvRow in $Csv) { # alle elemente von Report durchlaufen und vergleichen ForEach($ReportRow in $Report){ # Report Foldername mit Csv Foldername vergleichen If($ReportRow.Foldername -eq $CsvRow.Foldername){ # wenn der Foldername gleich ist wird das Element von der Report kopie entfernt $Report_2.Remove($ReportRow) } } } ForEach($Item in $Report2) { $Username = (($Item.Owner -split '\\')[1]) If (-Not ([String]::IsNullOrEmpty($Username))) { Write-Host "Ich bearbeite nun den User: $Username" Search-User -Username (($Item.Owner -split '\\')[1]) } Else { Write-Host "Username war leer!" } }
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Bearbeitet Peter Kriegel Dienstag, 14. Januar 2014 11:40
- Als Antwort vorgeschlagen Alex Pitulice Freitag, 17. Januar 2014 09:39
- Als Antwort markiert Alex Pitulice Dienstag, 21. Januar 2014 08:43
-
Hallo Dominique,
Funktioniert jetzt alles? Könntest Du bitte die entsprechenden Beiträge "als Antwort" auch markieren?
Viele Grüße,
AlexAlex Pitulice, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.