Powershell script läuft ohne Fehler, erzeugt aber kein Ausgabe
Hallo zusammen,
vielleicht kann mir jemand von euch weiterhelfen.
Ich habe hier ein Powershell Script, welches die AD durchsucht und mit mir die Größen der Homefolders in eine Exel tabelle speichern soll. Dazu habe ich einen Filter eingestellt der in der AD nach Abteilung und DFS-Root sucht
Nach ersten Problemchen, läuft das Script jetzt durch. Es werden exakt die Anzahl von ergebnissen dargestellt wie Anwender in der Abteilung mit dem genutzten DFS-Root existieren.
Es wird auch eine Exel Tabelle erzeugt. Diese ist jedoch Leer und beinhalten lediglich die Überschriften und am Ende ein Ergebnisfeld. Ich hoffe jemand hat heir einen Denkanstoss für mich, damit ich weiterkomme. Vielen Dank im voraus ;)
Hier das Script
Vielen Dank im voraus.
Viele Grüße
DerPue
vielleicht kann mir jemand von euch weiterhelfen.
Ich habe hier ein Powershell Script, welches die AD durchsucht und mit mir die Größen der Homefolders in eine Exel tabelle speichern soll. Dazu habe ich einen Filter eingestellt der in der AD nach Abteilung und DFS-Root sucht
Nach ersten Problemchen, läuft das Script jetzt durch. Es werden exakt die Anzahl von ergebnissen dargestellt wie Anwender in der Abteilung mit dem genutzten DFS-Root existieren.
Es wird auch eine Exel Tabelle erzeugt. Diese ist jedoch Leer und beinhalten lediglich die Überschriften und am Ende ein Ergebnisfeld. Ich hoffe jemand hat heir einen Denkanstoss für mich, damit ich weiterkomme. Vielen Dank im voraus ;)
Hier das Script
import-module ActiveDirectory
$OU = "dc=meine,dc=firma"
$objExcel = New-Object -ComObject "Excel.Application"
$objExcel.Visible = $false
$doc = $objExcel.Workbooks.Add()
$lo = $doc.Worksheets.Item(1).ListObjects.Add(1,$objExcel.Range("A1:B1"))
$lo.HeaderRowRange.Cells.Item(1,1).value2 = "Name"
$lo.HeaderRowRange.Cells.Item(1,2).value2 = "Ordnergröße"
$lo.ShowTotals = $True
$lo.ListColumns.Item(2).TotalsCalculation = 1
$ObjFilter = "(&(objectCategory=User)(objectCategory=Person))"
$objSearch = [adsisearcher]'(&(objectCategory=User)(objectCategory=Person))'
$objSearch.PageSize = 15000
$objSearch.Filter = $ObjFilter
$objSearch.SearchRoot = "LDAP://$OU"
$AllObj = GET-QADUser -LdapFilter "(physicalDeliveryOfficeName=Abteilung-123*)(homedirectory=*dfs-123*)" -SearchRoot 'DC=meine,DC=firma" | Select-Object Displayname, HomeDirectory
foreach ($Obj in $AllObj) {
$objItem = $Obj.Properties
$displayName = $objItem.displayname
$profilePath = $objItem.profilepath
if ($profilePath){
$size1 = [System.Math]::Round((dir "$profilePath" -Recurse | Measure-Object -Property length -Sum).Sum / (1024 * 1024),2)
}else{
$size1 = ""
}
$lo.ListRows.Add()
$lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,1).value2 = $displayname
$lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,2).value2 = $size1.Replace(",",".")
}
$objExcel.Visible = $true
Vielen Dank im voraus.
Viele Grüße
DerPue
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 212421
Url: https://administrator.de/contentid/212421
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo DerPue,
das Script kenne ich doch irgend woher
warum baust du den LDAP-Filter nicht direkt an der Stelle ein die dafür gedacht ist:
Das Get-QADUser liefert natürlich für den Code in der Schleife nicht den richtigen Objekttyp, deswegen wird auch kein Inhalt in das Excel-File geschrieben.
Mach es mal so:
Grüße Uwe
Gelöste Beitrage bitte auch als solche markieren.Danke.
das Script kenne ich doch irgend woher
warum baust du den LDAP-Filter nicht direkt an der Stelle ein die dafür gedacht ist:
$ObjFilter = "(&(objectCategory=User)(objectCategory=Person)(physicalDeliveryOfficeName=Abteilung-123*)(homedirectory=*dfs-123*))"
Das Get-QADUser liefert natürlich für den Code in der Schleife nicht den richtigen Objekttyp, deswegen wird auch kein Inhalt in das Excel-File geschrieben.
Mach es mal so:
import-module ActiveDirectory
$OU = "dc=meine,dc=firma"
$objExcel = New-Object -ComObject "Excel.Application"
$objExcel.Visible = $false
$doc = $objExcel.Workbooks.Add()
$lo = $doc.Worksheets.Item(1).ListObjects.Add(1,$objExcel.Range("A1:B1"))
$lo.HeaderRowRange.Cells.Item(1,1).value2 = "Name"
$lo.HeaderRowRange.Cells.Item(1,2).value2 = "Ordnergröße"
$lo.ShowTotals = $True
$lo.ListColumns.Item(2).TotalsCalculation = 1
$ObjFilter = "(&(objectCategory=User)(objectCategory=Person)(physicalDeliveryOfficeName=Abteilung-123*)(homedirectory=*dfs-123*))"
$objSearch =New-Object System.DirectoryServices.DirectorySearcher
$objSearch.PageSize = 15000
$objSearch.Filter = $ObjFilter
$objSearch.SearchRoot = "LDAP://$OU"
$AllObj = $objSearch.FindAll()
foreach ($Obj in $AllObj) {
$objItem = $Obj.Properties
$displayName = ""
$displayName = $objItem.displayname
$profilePath = $objItem.profilepath
if ($profilePath){
$size1 = [System.Math]::Round((dir "$profilePath" -Recurse | Measure-Object -Property length -Sum).Sum / (1024 * 1024),2)
}else{
$size1 = ""
}
$lo.ListRows.Add()
$lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,1).value2 = $displayname
$lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,2).value2 = $size1.Replace(",",".")
}
$objExcel.Visible = $true
Grüße Uwe
Gelöste Beitrage bitte auch als solche markieren.Danke.
Zitat von @DerPue:
erhalte ich die Meldung, dass der Name zu lang sei. Ich darf nur max. 260 Zeichen nutzen.
Da liegt wahrscheinlich der Hund in der Pfanne begraben, Pfade dürfen in Windows maximal 255 Zeichen lang sein.erhalte ich die Meldung, dass der Name zu lang sei. Ich darf nur max. 260 Zeichen nutzen.
Das dürfte auch im obigen Script die Fehlerursache sein, denn hier läuft mein Script soweit einwandfrei.
Wenn du es in eine CSV-Datei schreiben willst kannst du das so machen:
$array = @()
$ObjFilter = "(&(objectCategory=person)(objectCategory=User)(physicalDeliveryOfficeName=Abteilung123*)(homedirectory=*dfs-123*))"
$objSearch = New-Object System.DirectoryServices.DirectorySearcher
$objSearch.PageSize = 15000
$objSearch.Filter = $ObjFilter
$objSearch.SearchRoot = "LDAP://dc=meine,dc=firma"
$AllObj = $objSearch.FindAll()
foreach ($Obj in $AllObj)
{
$objItemS = $Obj.Properties
$dir = $objItemS.homedirectory
$size =[System.Math]::Round((dir $dir -Recurse | Measure-Object -Property length -Sum).Sum / (1024 * 1024),2)
$entry = @{Folder=$dir;Size=$size}
$array += New-Object PSObject -Property $entry
}
$array | export-csv "C:\Scripte\test.csv" -NoTypeInformation
Für überlange Pfadnamen gibt es eine Powershell Function die auf einem Workaround mit Robocopy basiert:
http://gallery.technet.microsoft.com/scriptcenter/Function-to-get-file- ...
http://gallery.technet.microsoft.com/scriptcenter/Function-to-get-file- ...
Gelöste Beitrage bitte auch als solche markieren. Danke.