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
Please also mark the comments that contributed to the solution of the article
Content-Key: 212421
Url: https://administrator.de/contentid/212421
Printed on: April 19, 2024 at 02:04 o'clock
14 Comments
Latest comment
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.