none
Aprosh admin tool RRS feed

  • 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
    Freitag, 13. Dezember 2013 10:36

Antworten

Alle Antworten

  • Hallo,

    also wozu Catch eigentlich gut ist kannst Du hier nachlesen:

    get-help about_try_catch_finally

    Beste Gruesse
    brima

    • Als Antwort markiert 001fred Dienstag, 17. Dezember 2013 13:55
    Freitag, 13. Dezember 2013 10:55
  • 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+

    Freitag, 13. Dezember 2013 12:42
  • Hallo,

    ich glaube das Problem liegt hier aber auch daran, dass der Catch Block einen Try Block erwartet, in dem Code gibt es ber keinen Try Block!

    Beste Gruesse
    brima

    Freitag, 13. Dezember 2013 13:11
  • @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+

    Freitag, 13. Dezember 2013 13:27
  • Hallo Peter,

    ja das hat er wirklich, dort fehlt auch eine } am Ende.

    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

    OK, Sorry Peter habe >in deinem< durch >im< ersetzt! :-)
    • Bearbeitet brima Freitag, 13. Dezember 2013 17:32
    Freitag, 13. Dezember 2013 13:36
  • 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+

    Freitag, 13. Dezember 2013 14:04
  • Bin im Moment mit

    Benutze die Funktion „Codeblock einfügen “ („</>“ -Symbol oben rechts).

    am kämpfen.

    Ich finde dieses Symbol nicht hier auf der web page???

    Freitag, 13. Dezember 2013 14:05
  • 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
    Freitag, 13. Dezember 2013 14:51
  • 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
    Freitag, 13. Dezember 2013 15:13
  • 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+

    Freitag, 13. Dezember 2013 17:24
  • 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))
    	}

    Dienstag, 17. Dezember 2013 07:38
  • 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
    Dienstag, 17. Dezember 2013 09:39
  • 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
    Dienstag, 17. Dezember 2013 13:54