Zum Inhalt wechseln


Foto

PowerShell Schleife läuft nicht mehrmals durch

Windows 7

  • Bitte melde dich an um zu Antworten
13 Antworten in diesem Thema

#1 Beginner18

Beginner18

    Newbie

  • 7 Beiträge

 

Geschrieben 02. März 2017 - 13:28

Moin,

ich habe hier eine etwas längere aber auch für mich eine etwas aufwendigere Abfrage geschrieben.

Die Daten funktionieren soweit, wie er sie mir ausgibt, aber er geht die Schleifen die ich unten eingegeben habe (Fett markierte Zeilen) jeweils nur einmal durch.

Woran liegt das?

Habe ich einen offensichtlichen Fehler gemacht beim Erstellen der Schleifen?

function Get-ADUserLastLogon([string]$userName)
{
$dcs = Get-ADDomainController -Filter {Name -like "*"}
#alle domaincontroller abfragen um die letzte anmeldung aller AD-User zu rthalten
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADUser $userName -Server $hostname -Properties lastLogon
$lngexpires = $user.lastLogon
if (-not ($lngexpires)) {$lngexpires = 0 }
If (($lngexpires -eq 0) -or ($lngexpires -gt [DateTime]::MaxValue.Ticks))
{
$LastLogon = "<Never>"
}
Else
{
$Date = [DateTime]$lngexpires
$LastLogon = $Date.AddYears(1600).ToLocalTime()
}
}
#alle AD-User abfragen und die gewünschten Properties auslesen und in eine csv Datei exportieren
}
cls
$excel = New-Object -ComObject excel.application
$excel.visible = $True
$workbook = $excel.Workbooks.Add()
#Genügend Mappen erzeugen
$excel.DisplayAlerts = $False
$sheet= $workbook.Worksheets.Item(1)
cls
#Role-HHLA-VMware-Administratoren
#Tabelle benennen
$sheet.Name = 'Administratoren'
#Formatierung der Überschriften
$sheet.Cells.Item(1,1).Font.Size = 10
$sheet.Cells.Item(1,1).Font.Italic=$True
$sheet.Cells.Item(1,2).Font.Size = 10
$sheet.Cells.Item(1,2).Font.Italic=$True
$sheet.Cells.Item(1,3).Font.Size = 10
$sheet.Cells.Item(1,3).Font.Italic=$True
$sheet.Cells.Item(1,4).Font.Size = 10
$sheet.Cells.Item(1,4).Font.Italic=$True
$sheet.Cells.Item(1,5).Font.Size = 10
$sheet.Cells.Item(1,5).Font.Italic=$True
$sheet.Cells.Item(1,6).Font.Size = 10
$sheet.Cells.Item(1,6).Font.Italic=$True
$sheet.Cells.Item(1,7).Font.Size = 10
$sheet.Cells.Item(1,7).Font.Italic=$True
 
 
#Tabellenüberschriften setzen
$sheet.Cells.Item(1,1) = 'Nachname'
$sheet.Cells.Item(1,2) = 'Vorname'
$sheet.Cells.Item(1,3) = 'Anzeigename'
$sheet.Cells.Item(1,4) = 'Letztes Anmeldedatum'
$sheet.Cells.Item(1,5) = 'Kontoablaufdatum'
$sheet.Cells.Item(1,6) = 'Abteilung'
$sheet.Cells.Item(1,7) = 'Kontoverzeichnis'
cls
Write-Host "+++ Auswertung von Role-HHLA-VMware-Administratoren wird erstellt..." -ForegroundColor Cyan
 
 
 
$row = 2
#In welche Spalte sollen die Infos eingefügt werden
$column = 1
foreach($samname in $infos){
$sheet.Cells.Item($row,$column) = $infos.samaccountname
$column++
#Increment to next Row and reset Column
$row++
$column = 1
}
 
 
$row = 2
#In welche Spalte sollen die Infos eingefügt werden
$column = 2
foreach($givenname in $infos){
$sheet.Cells.Item($row,$column) = $infos.GivenName
$column++
#Increment to next Row and reset Column
$row++
$column = 2
}
 
 
$row = 2
#In welche Spalte sollen die Infos eingefügt werden
$column = 3
foreach($name in $infos){
$sheet.Cells.Item($row,$column) = $infos.Name
$column++
#Increment to next Row and reset Column
$row++
$column = 3
}
 
 
$row = 2
#In welche Spalte sollen die Infos eingefügt werden
$column = 4
foreach($Lastlogon in $infos){
$sheet.Cells.Item($row,$column) = $infos.LastLogon
$column++
#Increment to next Row and reset Column
$row++
$column = 4
}
 
$row = 2
#In welche Spalte sollen die Infos eingefügt werden
$column = 5
foreach($accexpiration in $infos){
$sheet.Cells.Item($row,$column) = $infos.accountExpirationDate
$column++
#Increment to next Row and reset Column
$row++
$column = 5
}
 
$row = 2
#In welche Spalte sollen die Infos eingefügt werden
$column = 6
foreach($department in $infos){
$sheet.Cells.Item($row,$column) = $infos.Department
$column++
#Increment to next Row and reset Column
$row++
$column = 6
}
 
 
$row = 2
#In welche Spalte sollen die Infos eingefügt werden
$column = 7
foreach($distinguishedName in $infos){
$sheet.Cells.Item($row,$column) = $infos.DistinguishedName
$column++
#Increment to next Row and reset Column
$row++
$column = 7
}
 
$alleADUser = Get-ADUser -Filter {enabled -eq $true} | sort
foreach($user in $alleADUser)
{
Get-ADUserLastLogon $user.samaccountname
$infos = Get-ADUser $user.samaccountname -Properties *
$datum = $LastLogon
$samname = $infos.samaccountname
$givenname = $infos.GivenName
$name = $infos.Name
$accexpiration = $infos.accountExpirationDate
$distinguishedName = $infos.distinguishedName
$department = $infos.department
}

Bearbeitet von Beginner18, 02. März 2017 - 13:56.


#2 BOfH_666

BOfH_666

    Junior Member

  • 133 Beiträge

 

Geschrieben 02. März 2017 - 13:39

Du würdest Dir selbst und uns allen einen riesen Gefallen tun, wenn Du den Code, den Du hier postest auch als Code formatierst und Deinen Code entsprechend korrekt einrückst.

 

Du möchtest in Deinen Schleifen über eine Variable $Infos iterieren, hast diese Variable aber nirgendwo in dem Code, den Du gepostest hast, definiert oder gefüllt.


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#3 Beginner18

Beginner18

    Newbie

  • 7 Beiträge

 

Geschrieben 02. März 2017 - 13:46

I'm sorry, habe es aus PowerShell so kopiert und im Schreibeditor sah noch alles OK aus.

 

$Infos habe ich in der 8. Zeile von unten definiert? Zumindest bin ich der Überzeugung das er so die Informationen aus $user.samaccountname bezieht.  

Wenn nicht dann korrigiert mich.



#4 BOfH_666

BOfH_666

    Junior Member

  • 133 Beiträge

 

Geschrieben 02. März 2017 - 13:54

Du kannst die Variable auf jeden Fall erst benutzen, wenn Du sie definiert/gefüllt hast.


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#5 zahni

zahni

    Expert Member

  • 16.390 Beiträge

 

Geschrieben 02. März 2017 - 13:55

Nur mal kurz:

 

Die 1. Function endet vor dem CLS, wenn ich das richtig  sehe.

Die wird unten erst unten aufgerufen (nach dem fetten Text) 

Danach kommt Code, der keine Schleife enthält, also nur 1x ausgeführt wird.

Die Variablen dort werden aber  erst hinterher definiert bzw. mit Daten befüllt (?).

Der letzte Block  "foreach($user in $alleADUser)" ist sinnfrei, da nur durch das Array alleADUser loopt und Inhalte in Variablen schreibt.

Jeder Durchlauf überschreibt den vorigen Wert.

 

Bitte  beachten: Es kann gut sein, dass im Excel-Sheet eine Zeile steht. Weil in der Powershell-Shell noch die  Variablen vom vorhergehen Versuch gespeichert sind...


Bearbeitet von zahni, 02. März 2017 - 13:55.

Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#6 Beginner18

Beginner18

    Newbie

  • 7 Beiträge

 

Geschrieben 03. März 2017 - 06:00

Ok Danke!

Aber kannst du vielleicht noch ein bisschen genauer werden was das Ändern des Codes betrifft?

Ich bin nämlich grad am Ende meines Wissens und wüsste nicht wie ich die Schleife umschreiben soll, damit sie immer wieder durchläuft.

 

Gruß



#7 zahni

zahni

    Expert Member

  • 16.390 Beiträge

 

Geschrieben 03. März 2017 - 08:29

Ich kenne mich mit  dem Excel-Cmdlet nicht  wirklich  aus.

Generell würde ich aber  die Schleife  

 

foreach($user in $alleADUser)

{
Get-ADUserLastLogon $user.samaccountname
$infos = Get-ADUser $user.samaccountname -Properties *
$datum = $LastLogon
$samname = $infos.samaccountname
$givenname = $infos.GivenName
$name = $infos.Name
$accexpiration = $infos.accountExpirationDate
$distinguishedName = $infos.distinguishedName
$department = $infos.department
}

 

ein wenig erweitern...


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#8 BOfH_666

BOfH_666

    Junior Member

  • 133 Beiträge

 

Geschrieben 03. März 2017 - 09:59

...

Ich bin nämlich grad am Ende meines Wissens und wüsste nicht wie ich die Schleife umschreiben soll, damit sie immer wieder durchläuft.

...

 

.... ohne Dir zu nahe treten zu wollen ... wie wär's wenn Du mit etwas anfängst, was Dich nicht überfordert? 

 

z.B. könnte ich mir vorstellen, dass es vermutlich erst mal einfacher wäre, die von Dir benötigten Daten zu ermitteln und sie in eine CSV-Datei zu exportieren. Powershell kann gut mit solchen strukturierten Daten umgehen und ein CSV-Export macht die Daten auch für Excel verwertbar.


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#9 Beginner18

Beginner18

    Newbie

  • 7 Beiträge

 

Geschrieben 03. März 2017 - 10:48

Mit einem normalen CSV-Export habe ich es auch hinbekommen.

Jetzt wollte ich es direkt mit Formatierung in eine Excel Datei konvertieren und da habe ich jetzt mein Problem. Ich meinte das dieses Forum genau dafür ist? Um Fragen zu stellen und genau darauf eine Antwort oder eine Hilfestellung zu bekommen. Leider konnte ich durch Google, bei dem Thema, auch keine genaue Antwort finden. Wenn da jemand was weiß kann er es mir hier drunter schreiben oder wenn man es nicht weiß einfach weiterlesen...



#10 zahni

zahni

    Expert Member

  • 16.390 Beiträge

 

Geschrieben 03. März 2017 - 11:25

Schau mal hier:

 

https://www.amazon.d...ords=powershell

 

In einem Forum kann man leider nur bedingt Grundlagenwissen vermitteln. 

Und die  Lösung für Dich fertigstellen wird Dir auch keiner.  Einen Tipp hast Du ja schon bekommen.


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#11 Sunny61

Sunny61

    Expert Member

  • 22.101 Beiträge

 

Geschrieben 03. März 2017 - 11:52

Ich meinte das dieses Forum genau dafür ist?


Du solltest deine Ansprüche korrigieren.
Gruppenrichtlinien: http://www.gruppenrichtlinien.de/

#12 zahni

zahni

    Expert Member

  • 16.390 Beiträge

 

Geschrieben 03. März 2017 - 12:02

Es gibt viele Wege. Nils kennt da  einen ganz alten:

 

https://www.faq-o-ma...d-daten-nutzen/


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#13 BOfH_666

BOfH_666

    Junior Member

  • 133 Beiträge

 

Geschrieben 03. März 2017 - 13:12

OK ... dann solltest Du Dir das Leben einfacher machen!!   :D  :D   Schau mal hier:  https://blogs.techne...excel-module-2/

 

Man muss das Rad ja nicht immer wieder neu erfinden.   ;)  :cool:  :thumb1:


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#14 MurdocX

MurdocX

    Board Veteran

  • 553 Beiträge

 

Geschrieben 03. März 2017 - 14:04

Ein Programmierer würde vermeiden den gleichen Code mehrmals zu verwenden. Um dies auch zu tun, alleine wegen der Fehleranfälligkeit von viel Code, deine Aufzählung der Rows in eine For-Schleife zu packen. Des Weiteren machst du über "Get-ADUserLastLogon $user.samaccountname" eine Abfrage, jedoch wird diese nicht in einer Variable gespeichert. Konzentriere dich bei der Ausgabe der Daten entweder auf den Host, Variablen oder eine Datei. Versuche dies aber nicht zu mischen.


Mit freundlicher Unterstützung
Jan




Auch mit einem oder mehreren der folgenden Tags versehen: Windows 7