Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Powershell script läuft ohne Fehler, erzeugt aber kein Ausgabe

Frage Microsoft Windows Server

Mitglied: DerPue

DerPue (Level 1) - Jetzt verbinden

25.07.2013 um 08:02 Uhr, 2387 Aufrufe, 14 Kommentare

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
01.
import-module ActiveDirectory 
02.
 
03.
$OU = "dc=meine,dc=firma" 
04.
 
05.
$objExcel = New-Object -ComObject "Excel.Application" 
06.
$objExcel.Visible = $false 
07.
$doc = $objExcel.Workbooks.Add() 
08.
$lo = $doc.Worksheets.Item(1).ListObjects.Add(1,$objExcel.Range("A1:B1")) 
09.
$lo.HeaderRowRange.Cells.Item(1,1).value2 = "Name" 
10.
$lo.HeaderRowRange.Cells.Item(1,2).value2 = "Ordnergröße" 
11.
$lo.ShowTotals = $True 
12.
$lo.ListColumns.Item(2).TotalsCalculation = 1 
13.
 
14.
$ObjFilter = "(&(objectCategory=User)(objectCategory=Person))"  
15.
$objSearch = [adsisearcher]'(&(objectCategory=User)(objectCategory=Person))'  
16.
$objSearch.PageSize = 15000  
17.
$objSearch.Filter = $ObjFilter  
18.
$objSearch.SearchRoot = "LDAP://$OU"  
19.
$AllObj = GET-QADUser -LdapFilter "(physicalDeliveryOfficeName=Abteilung-123*)(homedirectory=*dfs-123*)" -SearchRoot 'DC=meine,DC=firma" | Select-Object Displayname, HomeDirectory  
20.
foreach ($Obj in $AllObj) {  
21.
    $objItem = $Obj.Properties  
22.
    $displayName = $objItem.displayname 
23.
    $profilePath = $objItem.profilepath 
24.
    if ($profilePath){ 
25.
	   $size1 = [System.Math]::Round((dir "$profilePath" -Recurse | Measure-Object -Property length -Sum).Sum / (1024 * 1024),2) 
26.
    }else{ 
27.
	   $size1 = "" 
28.
29.
    $lo.ListRows.Add() 
30.
    $lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,1).value2 = $displayname 
31.
    $lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,2).value2 = $size1.Replace(",",".") 
32.
33.
 
34.
$objExcel.Visible = $true

Vielen Dank im voraus.

Viele Grüße
DerPue
Mitglied: DerPue
25.07.2013 um 08:19 Uhr
_Nachtrag_
Ich habe die "ActiveRoles Managaement Shell for Active Directory x64" installiert, für die Abfrage in Zeile 19.
Bitte warten ..
Mitglied: colinardo
25.07.2013, aktualisiert um 11:35 Uhr
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:
$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:
01.
import-module ActiveDirectory 
02.
 
03.
$OU = "dc=meine,dc=firma" 
04.
 
05.
$objExcel = New-Object -ComObject "Excel.Application" 
06.
$objExcel.Visible = $false 
07.
$doc = $objExcel.Workbooks.Add() 
08.
$lo = $doc.Worksheets.Item(1).ListObjects.Add(1,$objExcel.Range("A1:B1")) 
09.
$lo.HeaderRowRange.Cells.Item(1,1).value2 = "Name" 
10.
$lo.HeaderRowRange.Cells.Item(1,2).value2 = "Ordnergröße" 
11.
$lo.ShowTotals = $True 
12.
$lo.ListColumns.Item(2).TotalsCalculation = 1 
13.
 
14.
$ObjFilter = "(&(objectCategory=User)(objectCategory=Person)(physicalDeliveryOfficeName=Abteilung-123*)(homedirectory=*dfs-123*))"  
15.
$objSearch =New-Object System.DirectoryServices.DirectorySearcher 
16.
$objSearch.PageSize = 15000  
17.
$objSearch.Filter = $ObjFilter  
18.
$objSearch.SearchRoot = "LDAP://$OU"  
19.
$AllObj = $objSearch.FindAll() 
20.
foreach ($Obj in $AllObj) {  
21.
    $objItem = $Obj.Properties 
22.
    $displayName = "" 
23.
    $displayName = $objItem.displayname 
24.
    $profilePath = $objItem.profilepath 
25.
    if ($profilePath){ 
26.
	   $size1 = [System.Math]::Round((dir "$profilePath" -Recurse | Measure-Object -Property length -Sum).Sum / (1024 * 1024),2) 
27.
    }else{ 
28.
	   $size1 = "" 
29.
30.
    $lo.ListRows.Add() 
31.
    $lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,1).value2 = $displayname 
32.
    $lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,2).value2 = $size1.Replace(",",".") 
33.
34.
 
35.
$objExcel.Visible = $true
Grüße Uwe
Gelöste Beitrage bitte auch als solche markieren.Danke.
Bitte warten ..
Mitglied: DerPue
25.07.2013 um 10:29 Uhr
Hallo Uwe,

Danke für Deine Antwort.
Ja genau, das Script sollte bekannt sein ;) Bin seinerzeit an einer Stelle nicht weitergekommen, da nun aber die Anforderung besteht, nach Abteilungen und Homedirectorys zu suchen, hab ich´s nochmal ausgekramt ^^
Den Filter hatte ich bereits an diser Stelle und erhalte bei jeder Antwort diese Fehlermeldung:
01.
  
02.
Application : Microsoft.Office.Interop.Excel.ApplicationClass 
03.
Creator     : 1480803660 
04.
Parent      : System.__ComObject 
05.
Index       : 25 
06.
InvalidData :  
07.
Range       : System.__ComObject 
08.
 
09.
Ausnahme beim Festlegen von "Value2": "Exception from HRESULT: 0x800A03EC" 
10.
In Zeile:34 Zeichen:5 
11.
+     $lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,1).value2 = $displa ... 
12.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
13.
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException 
14.
    + FullyQualifiedErrorId : CatchFromBaseAdapterSetValueTI
vielleicht siehst Du ja noch irgendwo einen Fehler?


Viele Grüße
DerPue
Bitte warten ..
Mitglied: colinardo
25.07.2013 um 10:33 Uhr
nehme beim Füllen der Excel Zellen mal folgende Eigenschaft: .value
$lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,1).value = $displayname  
$lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,2).value = $size1.Replace(",",".")
Bitte warten ..
Mitglied: DerPue
25.07.2013 um 10:42 Uhr
Das führt leider nur zu einem anderen Fehler
01.
Ausnahme beim Festlegen von "value": "Die Value-Eigenschaft für das PSMemberInfo-Objekt vom Typ "System.Management.Automation.PSParameterizedProperty" kann nicht  
02.
festgelegt werden." 
03.
In Zeile:30 Zeichen:5 
04.
+     $lo.ListRows.Item($lo.ListRows.Count).Range.Cells.Item(1,1).value = $display ... 
05.
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
06.
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException 
07.
    + FullyQualifiedErrorId : ExceptionWhenSetting
Bitte warten ..
Mitglied: DerPue
25.07.2013 um 15:06 Uhr
Da ich an dieser Stelle irgendwie nicht weiter komme, hab ich mir was anderes überlegt. Ich nehme folgendes Script
01.
$ObjFilter = "(&(objectCategory=person)(objectCategory=User)(physicalDeliveryOfficeName=Abteilung123*)(homedirectory=*dfs-123*))"  
02.
    $objSearch = New-Object System.DirectoryServices.DirectorySearcher  
03.
    $objSearch.PageSize = 15000  
04.
    $objSearch.Filter = $ObjFilter   
05.
    $objSearch.SearchRoot = "LDAP://dc=meine,dc=firma"  
06.
    $AllObj = $objSearch.FindAll()  
07.
    foreach ($Obj in $AllObj)  
08.
09.
            $objItemS = $Obj.Properties 
10.
            $objItemS.homedirectory | out-file "c:\scripts\output.txt" -append 
11.
12.
    get-content "C:\Scripts\output.txt" | get-childItem -recurse
Soweit, sogut ;)
Die Verzeichnisse werden mir nun alle angezeigt. Wenn ich nun allerdings versuche mit die Größen anzeigen zu lassen bzw. diese in eine csv zu speichern mit folgender Ergänzung in Zeile 12:
01.
get-content "C:\Scripts\output.txt" | get-childItem -recurse | measure-object -property length -sum >> "C:\temp2\verzeichnisse.csv"
erhalte ich die Meldung, dass der Name zu lang sei. Ich darf nur max. 260 Zeichen nutzen. Aber wieso bekomme ich die Dateien und Verzeichnisse ohne dass ich "measure-object" in die Pipe nehme angezeigt?
Jemand eine Idee?
Bitte warten ..
Mitglied: colinardo
25.07.2013, aktualisiert um 15:21 Uhr
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.
Das dürfte auch im obigen Script die Fehlerursache sein, denn hier läuft mein Script soweit einwandfrei.
Bitte warten ..
Mitglied: DerPue
25.07.2013 um 15:36 Uhr
*grummel*
;)
Ja das mit der Zeichenbegrenzung ist mir leider bekannt....^^
Merkwürdig ist halt, dass mit dem Befehl
01.
get-content "C:\Scripts\output.txt" | get-childItem -recurse
die Dateien trotzdem alle angezeigt werden.
Sowie, dass mit dem Script hier:
01.
 set-Location c:\ 
02.
add-PSSnapin  quest.activeroles.admanagement 
03.
 
04.
$AllObj = GET-QADUser -LdapFilter '(&(physicalDeliveryOfficeName=Abteilung123**)(homedirectory=*dfs-012*))' -SearchRoot 'DC=meine,DC=Firma' | Select-Object Displayname, HomeDirectory 
05.
 
06.
foreach ($Obj in $AllObj)  
07.
08.
      $fs = New-Object -comobject Scripting.FileSystemObject 
09.
      $tempSize = $fs.GetFolder($Obj.homedirectory).size/1024/1024 
10.
      $tempSize = ‘{0:N}’ -f [double]$tempSize 
11.
      Write-Host "$Obj.Displayname" + “$tempSize MB” 
12.
      } 
Auch die Ausgabe der Directorys und Größen angegeben wird.... hier hab ich leider nciht geschafft, mir das ganze in eine csv o.ä. ausgeben zu lassen.
Vielleicht kann man ja daran anknüpfen, sofern Du einen Denkanstoß für mich hast :D
Vielen Dank auf jeden Fall schonmal im voraus für Deine in meine Frage investierte Zeit.

viele Grüße
Bitte warten ..
Mitglied: colinardo
25.07.2013, aktualisiert um 16:11 Uhr
Wenn du es in eine CSV-Datei schreiben willst kannst du das so machen:
01.
$array = @() 
02.
 
03.
$ObjFilter = "(&(objectCategory=person)(objectCategory=User)(physicalDeliveryOfficeName=Abteilung123*)(homedirectory=*dfs-123*))"  
04.
    $objSearch = New-Object System.DirectoryServices.DirectorySearcher  
05.
    $objSearch.PageSize = 15000  
06.
    $objSearch.Filter = $ObjFilter   
07.
    $objSearch.SearchRoot = "LDAP://dc=meine,dc=firma"  
08.
    $AllObj = $objSearch.FindAll()  
09.
    foreach ($Obj in $AllObj)  
10.
11.
            $objItemS = $Obj.Properties 
12.
            $dir = $objItemS.homedirectory 
13.
            $size =[System.Math]::Round((dir $dir -Recurse | Measure-Object -Property length -Sum).Sum / (1024 * 1024),2) 
14.
            $entry = @{Folder=$dir;Size=$size} 
15.
            $array += New-Object PSObject -Property $entry 
16.
17.
   $array | export-csv "C:\Scripte\test.csv" -NoTypeInformation
Bitte warten ..
Mitglied: DerPue
26.07.2013, aktualisiert um 07:46 Uhr
Leider gibts auch hier den Fehler, dass zuviele Zeichen vorhanden sind...

Dieses hier läuft nun:
01.
 set-Location c:\ 
02.
add-PSSnapin  quest.activeroles.admanagement 
03.
 
04.
$AllObj = GET-QADUser -LdapFilter '(physicalDeliveryOfficeName=Abteilung123*)(homedirectory=*dfs-123*)' -SearchRoot 'DC=meine,DC=firma' | Select-Object Displayname, HomeDirectory 
05.
 
06.
foreach ($Obj in $AllObj)  
07.
08.
      $fs = New-Object -comobject Scripting.FileSystemObject 
09.
      $tempSize = $fs.GetFolder($Obj.homedirectory).size/1024/1024 
10.
      $tempSize = ‘{0:N3}’ -f [double]$tempSize 
11.
      $Obj.Displayname + "$tempSize MB" | out-file -filepath "C:\temp2\test.csv" -append 
12.
      } 
hier ist jetzt lediglich das Problem, dass bei einigen Verzeichnissen die Fehlermeldung erscheint,
>code>
Der Wert "1.814,275" kann nicht in den Typ "System.Double" konvertiert werden. Fehler: "Input string was not in a correct format."
In Zeile:22 Zeichen:7
+ $tempSize = ‘{0:N3}’ -f [double]$tempSize
</code>

unschön ist auch dass nun der Name und die Verzeichnisgröße direkt nebeneinander stehen und räumlich nicht getrennt werden.
Auch die Umwandlung in GB will nicht so recht funktionieren
Bitte warten ..
Mitglied: colinardo
26.07.2013 um 07:49 Uhr
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- ...
Bitte warten ..
Mitglied: DerPue
30.07.2013 um 12:50 Uhr
Hello again,
heute bin ich mal wieder dazu gekommen, mich mit dem Script ein wenig zu befassen.
Bin jetzt zumindest soweit, dass ich mir die Verzeichnispfade in eine csv schreiben lasse und danach die einzelnen Einträge abarbeiten lasse.
Hier mal das Script:
01.
#Erstellen einer Verzeichnisliste mit Userhome 
02.
$ObjFilter = "(&(objectCategory=person)(objectCategory=User)(physicalDeliveryOfficeName=Abteilung123*)(homedirectory=*dfs-123*))"  
03.
    $objSearch = New-Object System.DirectoryServices.DirectorySearcher  
04.
    $objSearch.PageSize = 15000  
05.
    $objSearch.Filter = $ObjFilter   
06.
    $objSearch.SearchRoot = "LDAP://dc=meine,dc=firma"  
07.
    $AllObj = $objSearch.FindAll()  
08.
    foreach ($Obj in $AllObj)  
09.
10.
            $objItemS = $Obj.Properties 
11.
            $objItemS.homedirectory | out-file "c:\scripts\output.csv" -append 
12.
           }  
13.
#Liste einlesen und Größe berechnen  
14.
$startfolder=get-content c:\scripts\output.csv  
15.
  
16.
$colItems = (Get-ChildItem $startFolder -recurse | Measure-Object -property length -sum) 
17.
 "$startFolder -- " + "{0:N2}" -f ($colItems.sum / 1MB) + " MB" | out-file C:\Scripts\test.csv
leider scheiter ich noch an der Pfadlänge, hier habe ich es auch net geschafft den Link, welchen colinardo freundlicherweise gepostet hat einzubauen.
Unschön ist auch, dass nachdem das Script durchgelaufen ist, alle Verzeichnispfade in einer Zeile geschrieben werden und am Ende die Größe angegeben wird.

Vielleicht hat jemand noch eine Idee? Würde mich freuen....

Vieel Grüße
DerPue
Bitte warten ..
Mitglied: DerPue
13.08.2013 um 09:06 Uhr
Wir haben es nun wie folgt gelöst.... direkt auf dem Fileserver ausgeführt...

01.
Import-Module ActiveDirectory 
02.
 
03.
$date = Get-Date -uformat "%Y-%m-%d" 
04.
$ExportFile = "C:\Export\Userhomes $Date.txt" 
05.
#$USRHs = @$USRHs = @("E:\HOME") 
06.
 
07.
$IDsVol = @() 
08.
foreach ($USRH in $USRHs) { 
09.
	$IDs = Get-ChildItem $USRH 
10.
	foreach ($ID in $IDs) { 
11.
		Write-Host "Lese Userhome: " $ID.Name 
12.
		$dept = $Null 
13.
		$dept = (Get-ADUser $ID.Name -Properties PhysicalDeliveryOfficeName).PhysicalDeliveryOfficeName 
14.
		$Path = $USRH + "\" + $ID.Name 
15.
		$SUM = Get-ChildItem $Path -recurse | Measure-Object -property length -sum 
16.
		$GiB = $SUM.sum / 1024 / 1024 / 1024 
17.
		$IDsVol += New-Object psobject -Property @{ID=$ID.Name; GiB=[math]::Round($GiB,3); Department=$dept.substring(0,$dept.indexof(" ")); USRH=$USRH} 
18.
		cls 
19.
		$IDsVol | ft ID, GiB, Department, USRH -AutoSize 
20.
21.
22.
 
23.
$IDsVol | Sort Department | Select-Object ID, GiB, Department, USRH | Export-Csv $ExportFile -Delimiter ";"
Bitte warten ..
Mitglied: colinardo
13.08.2013 um 09:11 Uhr
Gelöste Beitrage bitte auch als solche markieren. Danke.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst PowerShell Script Move-Item nach x Tagen (5)

Frage von lupolo zum Thema Batch & Shell ...

VB for Applications
Powershell Script aus VBA heraus ausführen (2)

Frage von mcnico1978 zum Thema VB for Applications ...

Batch & Shell
gelöst Powershell-Script als Admin über CMD ausführen (2)

Frage von Tobiased zum Thema Batch & Shell ...

Batch & Shell
Windows Explorer hängt sich bei Powershell Script auf (5)

Frage von zamsi7 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...