Benutzer mit den meisten Antworten
Aprosh admin tool

Frage
-
Guten Tag Peter,
Du hattest mir mal einen code bereitgestellt um lokalle Benutzer in einem GUI listview aufzulisten.
Der code funktioniert sehr gut obwohl immer ein Fehler generiert wird den ich nicht verstehe und damit auch nicht beseitigne kann.
1218 heisst wohl Zeile und 80 heisst wohl Zeichen 80?
Vielleicht kannst Du etwas Licht in die Dunkelheit bringen?
Fehlermeldung: Exception calling.... und Catch
Habe Catch einfach mal mit # Catch ausgeblendet und der Fehler ist weg würde mich aber interessieren warum Du in eingeben hast wenn er "keine Funktion" hat bezw. nicht benötigt wird.
Kann zumindest nicht feststellen, dass irgendetwas nicht funktioniert nachdem ich catch ausgeblendet habe.
der gleiche Fehler tritt auch unter anderen Benutzerkonten auf
\\LT-0421I-ECB\root\cimv2:Win32_Group.Domain="LT-0421I-ECB",Name="Administrators"
Exception calling "Add" with "1" argument(s): "Object reference not set to an instance of an
object."
At C:\Users\sa_ringfri\Documents\WindowsPowerShell\Windows System Administration Tool.ps1:1218
char:80
+ ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){$Field = $Col.Text;$ ...
+ ~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NullReferenceException
Exception calling "Add" with "1" argument(s): "Object reference not set to an instance of an
object."
At C:\Users\sa_ringfri\Documents\WindowsPowerShell\Windows System Administration Tool.ps1:1218
char:80
+ ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){$Field = $Col.Text;$ ...
+ ~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NullReferenceException
Exception calling "Add" with "1" argument(s): "Object reference not set to an instance of an
object."
At C:\Users\sa_ringfri\Documents\WindowsPowerShell\Windows System Administration Tool.ps1:1218
char:80
+ ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){$Field = $Col.Text;$ ...
+ ~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NullReferenceException
Catch : The term 'Catch' is not recognized as the name of a cmdlet, function, script file, or
operable program. Check the spelling of the name, or if a path was included, verify that the path
is correct and try again.
At C:\Users\sa_ringfri\Documents\WindowsPowerShell\Windows System Administration Tool.ps1:1224
char:3
+ Catch{$SBPStatus.Text = "[$ComputerName] Error: Could not retrieve local admin ...
+ ~~~~~
+ CategoryInfo : ObjectNotFound: (Catch:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Code:
$btnLocalUsersGroups_Click={
Get-ComputerName
Initialize-Listview
$SBPStatus.Text = "Retrieving Local Users and Groups..."
Update-ContextMenu (Get-Variable cmsUser*)
'Type','Name','Domain','SID' | ForEach-Object {Add-Column $_}
$LocalUsers = Get-WmiObject -computername $ComputerName -query "Select * from Win32_UserAccount Where LocalAccount = True"
ForEach($LocalUser in $LocalUsers) {
$Item = New-Object System.Windows.Forms.ListViewItem('LocalUser')
$Item.SubItems.Add($LocalUser.Name)
$Item.SubItems.Add($LocalUser.Domain)
$Item.SubItems.Add($LocalUser.SID)
$lvMain.Items.Add($Item)
}
$LocalGroups = Get-WmiObject -computername $ComputerName -query "SELECT * FROM Win32_Group Where Domain='$ComputerName'"
ForEach($LocalGroup in $LocalGroups) {
Write-Host $LocalGroup
$Item = New-Object System.Windows.Forms.ListViewItem('Group')
$Item.BackColor = "Red"
$Item.ForeColor = "Yellow"
$NewItem = $Item.SubItems.Add($LocalGroup.Name)
$NewItem.BackColor = "Red"
$NewItem.ForeColor = "Yellow"
$NewItem = $Item.SubItems.Add($LocalGroup.Domain)
$NewItem.BackColor = "Red"
$NewItem.ForeColor = "Yellow"
$NewItem = $Item.SubItems.Add($LocalGroup.SID)
$NewItem.BackColor = "Red"
$NewItem.ForeColor = "Yellow"
$lvMain.Items.Add($Item)
#
# Direkte User in Gruppen auflösen
#
$GroupUsers = Get-WmiObject -computername $ComputerName -Query "SELECT * FROM Win32_GroupUser WHERE GroupComponent=`"Win32_Group.Domain='$Computername',Name='$($LocalGroup.Name)'`"" | Foreach-Object {[wmi]$_.PartComponent}
If($GroupUsers) {
ForEach($GroupUser in $GroupUsers) {
$Item = New-Object System.Windows.Forms.ListViewItem('GroupMember')
$Item.SubItems.Add($GroupUser.Name)
$Item.SubItems.Add($GroupUser.Domain)
$Item.SubItems.Add($GroupUser.SID)
$lvMain.Items.Add($Item)
}
$Info | %{
$Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0)
1218 ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){$Field = $Col.Text;$Item.SubItems.Add($_.$Field)}
$lvMain.Items.Add($Item)
}
$SBPStatus.Text = "Ready"
}
??? # Catch
{$SBPStatus.Text = "[$ComputerName] Error: Could not retrieve local administrators."}
}
Vorab vielen Dank
- Bearbeitet 001fred Freitag, 13. Dezember 2013 10:38
Antworten
-
Wenn du auf Antworten Drückst erscheint der Editor. Dieser hat Kleine Symbole in seiner leiste! Dort kann man z.B. auch Bilder einfügen.
Ich habe dir den Code Editor Gelb Markiert:
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 markiert 001fred Dienstag, 17. Dezember 2013 13:56
-
Um Fehler abzufangen setzt man in der PowerShell oft das Try{} Catch{} Konstukt ein.
Zu einem Try{} Block gehört IMMER ein Catch {} Block!
Bitte lies dich in diese Vorgehensweise ein!
http://www.colorconsole.de/PS_Windows/de/about_try_catch_finally.htm
http://www.admin-source.de/BlogDeu/954/powershell-try-catch-finally
hier fehlt in deinem Code der Try{} Block!
Deshalb brauchst du auch keinen Catch{} Block.
Lösch die Zeile einfach raus!
Die folgende Zeile macht mich traurig.
Catch {throw $_ } {$SBPStatus.Text = "[$ComputerName] Error: Could not retrieve local administrators."}
Man kann in PowerShell nicht einfach 2 Scriptblöcke {} {} hintereinander schreiben das Funktioniert nicht!
Die geschweiften Klammer {} bilden ein so genannten Scriptblock.
Innerhalb der Klammer kann man beliebigen PowerShell Code schreiben.
Ein Scriptblock muss durch ein PowerSchell Schlüsselwort oder durch ein expliziten Aufruf z.B. & {} zur Ausführung gebracht werden.
Wenn man einen Scriptblock einfach so hinschreibt, ohne ein passendes Schlüsselwort ist der Scriptblock sinnlos!
In meinen Youtube Videos habe ich den Scriptblock erklärt.
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, 17. Dezember 2013 09:41
- Als Antwort markiert 001fred Dienstag, 17. Dezember 2013 13:56
Alle Antworten
-
Hallo Fred!
Das Forum hier heißt nicht Peter ;-) Dies ist ein Forum wo dir viele Leute helfen können.
Versuche deine Fragen immer so zu stellen das dir jeder hier helfen könnte!
Bitte nutze in diesem Forum hier die Möglichkeit den Code auch als Code zu Posten.
Benutze die Funktion „Codeblock einfügen “ („</>“ -Symbol oben rechts).
Brima hat schon Recht, du solltest dich mal mit dem Sinn und Unsinn von Fehlerbehandlungen in Skripten vertraut machen.http://www.colorconsole.de/PS_Windows/de/about_try_catch_finally.htm
Ich habe dazu auch einen kleinen Blog Artikel geschrieben.
http://www.admin-source.de/BlogDeu/954/powershell-try-catch-finally
Wenn der Code im Catch ausgeführt worden ist, ist dort definitiv ein Fehler aufgetreten.
Wenn du das Catch ausschaltet, dann schaltest du in diesem Fall die Fehlermeldung aus.
Fehler die man nicht sieht sind trotzdem da! Irgendwann stolpert man über diesen Fehler. Dann sucht man den Fehler den man nicht mehr sieht!Fehlermeldungen sollten nicht abgeschaltet werden. Fehler sollte behandelt und beseitigt werden!
im Moment wird in dem Catch einen "nichssagende" Fehlermeldung generiert.
Ersetze die Catch Zeile mal mit der folgenden, dann siehst du den echten Fehler!
Catch { throw $_ }
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 Freitag, 13. Dezember 2013 12:46
-
@Brima
Der Fred hat den Code hier unsauber Präsentiert!
Der richtige Code abschnitt sieht so aus:
$btnLocalAdmins_Click={ Get-ComputerName Initialize-Listview $SBPStatus.Text = "Retrieving Local Admins..." Update-ContextMenu (Get-Variable cmsAdmin*) $XML.Options.LocalAdmins.Property | %{Add-Column $_} Resize-Columns $Col0 = $lvMain.Columns[0].Text Try{ $AdministratorsGroupName = (Get-WmiObject -Query "Select * From Win32_Group Where LocalAccount = TRUE And SID = 'S-1-5-32-544'").Name $Group = [ADSI]("WinNT://$ComputerName/$AdministratorsGroupName,group") $Info = @() $Group.Members() | %{ $AdsPath = $_.GetType().InvokeMember("Adspath", 'GetProperty', $null, $_, $null) $Prop = $AdsPath.split('/',[StringSplitOptions]::RemoveEmptyEntries) $Name = $Prop[-1] $Domain = $Prop[-2] $Class = $_.GetType().InvokeMember("Class", 'GetProperty', $null, $_, $null) $Member = New-Object PSObject -Property @{ Name = $Name Domain = $Domain Class = $Class } $Info += $Member } $Info | %{ $Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0) ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){$Field = $Col.Text;$Item.SubItems.Add($_.$Field)} $lvMain.Items.Add($Item) } $SBPStatus.Text = "Local Administrators Ready" } Catch{$SBPStatus.Text = "[$ComputerName] Error: Could not retrieve local administrators."} }
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+ -
Hallo Peter,
ja das hat er wirklich, dort fehlt auch eine } am Ende.
OK, Sorry Peter habe >in deinem< durch >im< ersetzt! :-)
Ich wollte es nur fuer Fred verdeutlichen, wenn er sich damit und der Hifle beschaeftigt.
Das im Original Code der Block gefehlt haette koennte ich mir auch wirklich nicht vorstellen.
Beste Gruesse
brima- Bearbeitet brima Freitag, 13. Dezember 2013 17:32
-
Der Code ist nicht von mir!
Ich würde in einem Script NIEMALS Aliase wie z.B. % verwenden!
WÜRG....
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+ -
Wenn du auf Antworten Drückst erscheint der Editor. Dieser hat Kleine Symbole in seiner leiste! Dort kann man z.B. auch Bilder einfügen.
Ich habe dir den Code Editor Gelb Markiert:
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 markiert 001fred Dienstag, 17. Dezember 2013 13:56
-
Wo ist das Problem?
Zwischen Stuhl und Tastatur natürlich!! ;-))
# # Lädt lokale Benutzern und Gruppen # $btnLocalUsersGroups_Click={ Get-ComputerName Initialize-Listview $SBPStatus.Text = "Retrieving Local Users and Groups..." Update-ContextMenu (Get-Variable cmsUser*) 'Type','Name','Domain','SID' | ForEach-Object {Add-Column $_} $LocalUsers = Get-WmiObject -computername $ComputerName -query "Select * from Win32_UserAccount Where LocalAccount = True" ForEach($LocalUser in $LocalUsers) { $Item = New-Object System.Windows.Forms.ListViewItem('LocalUser') $Item.SubItems.Add($LocalUser.Name) $Item.SubItems.Add($LocalUser.Domain) $Item.SubItems.Add($LocalUser.SID) $lvMain.Items.Add($Item) } $LocalGroups = Get-WmiObject -computername $ComputerName -query "SELECT * FROM Win32_Group Where Domain='$ComputerName'" ForEach($LocalGroup in $LocalGroups) { Write-Host $LocalGroup $Item = New-Object System.Windows.Forms.ListViewItem('Group') $Item.BackColor = "Red" $Item.ForeColor = "Yellow" $NewItem = $Item.SubItems.Add($LocalGroup.Name) $NewItem.BackColor = "Red" $NewItem.ForeColor = "Yellow" $NewItem = $Item.SubItems.Add($LocalGroup.Domain) $NewItem.BackColor = "Red" $NewItem.ForeColor = "Yellow" $NewItem = $Item.SubItems.Add($LocalGroup.SID) $NewItem.BackColor = "Red" $NewItem.ForeColor = "Yellow" $lvMain.Items.Add($Item) # # Direkte User in Gruppen auflösen # $GroupUsers = Get-WmiObject -computername $ComputerName -Query "SELECT * FROM Win32_GroupUser WHERE GroupComponent=`"Win32_Group.Domain='$Computername',Name='$($LocalGroup.Name)'`"" | Foreach-Object {[wmi]$_.PartComponent} If($GroupUsers) { ForEach($GroupUser in $GroupUsers) { $Item = New-Object System.Windows.Forms.ListViewItem('GroupMember') $Item.SubItems.Add($GroupUser.Name) $Item.SubItems.Add($GroupUser.Domain) $Item.SubItems.Add($GroupUser.SID) $lvMain.Items.Add($Item) } $Info | %{ $Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0) ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){$Field = $Col.Text;$Item.SubItems.Add($_.$Field)} $lvMain.Items.Add($Item) } $SBPStatus.Text = "Ready" } Catch{$SBPStatus.Text = "[$ComputerName] Error: Could not retrieve local administrators."} } # besseres column resize ForEach($Column in $lvMain.Columns) { $lvMain.AutoResizeColumn($Column.Index,([System.Windows.Forms.ColumnHeaderAutoResizeStyle]::ColumnContent)) }
Irgenwie scheine ich Mist zu bauen!In meiner ISE Konsole ist der letzte teil des codes nicht grün.Bis am Montag und schönes Wochenende.
- Bearbeitet 001fred Freitag, 13. Dezember 2013 16:26
-
Nein es liegt nicht an dir sondern an dem schlechten Code parser. Den Microsoft Programmiert hat. Microsoft kennt die PowerShell Syntax halt nicht richtig ! ;-)
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+ -
Guten Morgen,
da bich ich aber froh, dass es mal nicht an mir liegt! ;-))
In dem code für localadmins bekomme ich keine Fehlermeldung.
Es ist der Code für localusersaandgroups.
Ich habe mal Catch {throw $_}, Catch{throw $_} und Catch { throw $_ } angehängt aber ich bekomme immmer noch den gleichen "Fehler".
Auch die Abschlussklammer ist/war eingefügt.
dass der Catch Block einen Try Block erwartet?????
Verstehe also immer noch nicht wovon Ihr redet/schreibt.
# # Lädt lokale Benutzern und Gruppen # $btnLocalUsersGroups_Click={ Get-ComputerName Initialize-Listview $SBPStatus.Text = "Retrieving Local Users and Groups..." Update-ContextMenu (Get-Variable cmsUser*) 'Type','Name','Domain','SID' | ForEach-Object {Add-Column $_} $LocalUsers = Get-WmiObject -computername $ComputerName -query "Select * from Win32_UserAccount Where LocalAccount = True" ForEach($LocalUser in $LocalUsers) { $Item = New-Object System.Windows.Forms.ListViewItem('LocalUser') $Item.SubItems.Add($LocalUser.Name) $Item.SubItems.Add($LocalUser.Domain) $Item.SubItems.Add($LocalUser.SID) $lvMain.Items.Add($Item) } $LocalGroups = Get-WmiObject -computername $ComputerName -query "SELECT * FROM Win32_Group Where Domain='$ComputerName'" ForEach($LocalGroup in $LocalGroups) { Write-Host $LocalGroup $Item = New-Object System.Windows.Forms.ListViewItem('Group') $Item.BackColor = "Red" $Item.ForeColor = "Yellow" $NewItem = $Item.SubItems.Add($LocalGroup.Name) $NewItem.BackColor = "Red" $NewItem.ForeColor = "Yellow" $NewItem = $Item.SubItems.Add($LocalGroup.Domain) $NewItem.BackColor = "Red" $NewItem.ForeColor = "Yellow" $NewItem = $Item.SubItems.Add($LocalGroup.SID) $NewItem.BackColor = "Red" $NewItem.ForeColor = "Yellow" $lvMain.Items.Add($Item) # # Direkte User in Gruppen auflösen # $GroupUsers = Get-WmiObject -computername $ComputerName -Query "SELECT * FROM Win32_GroupUser WHERE GroupComponent=`"Win32_Group.Domain='$Computername',Name='$($LocalGroup.Name)'`"" | Foreach-Object {[wmi]$_.PartComponent} If($GroupUsers) { ForEach($GroupUser in $GroupUsers) { $Item = New-Object System.Windows.Forms.ListViewItem('GroupMember') $Item.SubItems.Add($GroupUser.Name) $Item.SubItems.Add($GroupUser.Domain) $Item.SubItems.Add($GroupUser.SID) $lvMain.Items.Add($Item) } $Info | %{ $Item = New-Object System.Windows.Forms.ListViewItem($_.$Col0) ForEach ($Col in ($lvMain.Columns | ?{$_.Index -ne 0})){$Field = $Col.Text;$Item.SubItems.Add($_.$Field)} $lvMain.Items.Add($Item) } $SBPStatus.Text = "Ready" } Catch {throw $_ } {$SBPStatus.Text = "[$ComputerName] Error: Could not retrieve local administrators."} } # besseres column resize ForEach($Column in $lvMain.Columns) { $lvMain.AutoResizeColumn($Column.Index,([System.Windows.Forms.ColumnHeaderAutoResizeStyle]::ColumnContent)) }
-
Um Fehler abzufangen setzt man in der PowerShell oft das Try{} Catch{} Konstukt ein.
Zu einem Try{} Block gehört IMMER ein Catch {} Block!
Bitte lies dich in diese Vorgehensweise ein!
http://www.colorconsole.de/PS_Windows/de/about_try_catch_finally.htm
http://www.admin-source.de/BlogDeu/954/powershell-try-catch-finally
hier fehlt in deinem Code der Try{} Block!
Deshalb brauchst du auch keinen Catch{} Block.
Lösch die Zeile einfach raus!
Die folgende Zeile macht mich traurig.
Catch {throw $_ } {$SBPStatus.Text = "[$ComputerName] Error: Could not retrieve local administrators."}
Man kann in PowerShell nicht einfach 2 Scriptblöcke {} {} hintereinander schreiben das Funktioniert nicht!
Die geschweiften Klammer {} bilden ein so genannten Scriptblock.
Innerhalb der Klammer kann man beliebigen PowerShell Code schreiben.
Ein Scriptblock muss durch ein PowerSchell Schlüsselwort oder durch ein expliziten Aufruf z.B. & {} zur Ausführung gebracht werden.
Wenn man einen Scriptblock einfach so hinschreibt, ohne ein passendes Schlüsselwort ist der Scriptblock sinnlos!
In meinen Youtube Videos habe ich den Scriptblock erklärt.
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, 17. Dezember 2013 09:41
- Als Antwort markiert 001fred Dienstag, 17. Dezember 2013 13:56
-
Dann haben wir ja wieder neuen Lesestoff!! ;-))
OK, dann bedanke ich mich mal wieder fürs Erste und markiere die Antworten als hilfreich und beantwortet.
Ich wünsche Euch und euren Familien ein gesegnetes Weihnachtsfest und alles Gute für das neue Jahr!!
- Bearbeitet 001fred Dienstag, 17. Dezember 2013 13:57