none
Brauche Hilfe bei Powershell Script RRS feed

  • 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

    Montag, 6. Januar 2014 07:15

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
    Dienstag, 14. Januar 2014 11:27
  • 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
    Dienstag, 14. Januar 2014 11:34

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
    Montag, 6. Januar 2014 11:26
  • Funktioniert bei mir nicht

    Gibt bei mir folgende Fehlermeldung.


    Dominique Hofmann

    Montag, 13. Januar 2014 11:42
  • 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+

    Montag, 13. Januar 2014 12:17
  • Hier ist es noch einmal.

    Du solltest es erkennen wenn du Rechtsklick "Bild in neuem Tab öffen" machst

    st


    Dominique Hofmann

    Dienstag, 14. Januar 2014 09:53
  • 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
    Dienstag, 14. Januar 2014 11:27
  • 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
    Dienstag, 14. Januar 2014 11:34
  • Vielen Dank für die rasche Antwort ^^

    Dominique Hofmann

    Dienstag, 14. Januar 2014 11:41