admwonh
Goto Top

Lokale Admingruppe Remote per Powershell auslesen

Hallo zusammen,

ich habe da mal ein Script gebastelt womit ich sehen kann wer auf unseren Rechnern alles lokale Adminrechte hat.
Das Script prüft vorher ob der Rechner erreichbar ist.
Das Funktioniert auch soweit schon, leider bekomme ich manchmal den Fehler, dass der RPC nicht aktiv ist. Diesen möchte ich gern Filtern, aber das will mir nicht gelingen.

Der Fehler taucht in Zeile 09 auf aber ich kann ihn mit Zeile 12 nicht abfangen und Leserlich darstellen face-sad
Die Fehlermeldung steht unter dem Code.

Danke für tolle Hinweise.

VG Florian

function get-localadmins{
  [cmdletbinding()]
  Param(
  [string]$computerName
  )
  

  try{
  $group = get-wmiobject win32_group -ComputerName $computerName -Filter "LocalAccount=True AND SID='S-1-5-32-544'"  
  }
  catch{
  if ($group -match 'Der RPC-Server ist nicht verfügbar'){write-host "RPC nicht aktiv"}  
  }

  $query = "GroupComponent = `"Win32_Group.Domain='$($group.domain)'`,Name='$($group.name)'`""  
  $list = Get-WmiObject win32_groupuser -ComputerName $computerName -ErrorAction SilentlyContinue -Filter $query 
  $list | %{$_.PartComponent} | % {$_.substring($_.lastindexof("Domain=") + 7).replace("`",Name=`"","\")} |  select-object @{Name="USERNAME";Expression={$_}},@{Name="PCNAME";Expression={$computerName}}  
}

Function Test-ConnectionQuietFast {
 
    [CmdletBinding()]
    param(
    [String]$ComputerName,
    [int]$Count = 1,
    [int]$Delay = 250
        )
 
    for($I = 1; $I -lt $Count + 1 ; $i++)
    {
        #Write-Verbose "Ping Computer: $ComputerName, $I try with delay $Delay milliseconds" 
 
        # Test the connection quiet to the computer with one ping
        If (Test-Connection -ComputerName $ComputerName -Quiet -Count 1)
        {
            # Computer can be contacted, return $True
            #Write-Verbose "Computer: $ComputerName is alive! With $I ping tries and a delay of $Delay milliseconds" 
            return $True
        }
 
        # delay between each pings
        Start-Sleep -Milliseconds $Delay
    }
 
    # Computer cannot be contacted, return $False
    Write-Verbose "Computer: $ComputerName cannot be contacted! With $Count ping tries and a delay of $Delay milliseconds"  
    $False
}


$server = @(Get-Content C:\User\User.txt)


foreach($servers in $server)
{
$connect = Test-ConnectionQuietFast -ComputerName $servers -Count 2 -Delay 250 –Verbose -ErrorAction Stop

if ($connect -eq $true){
$servers=$servers | % { get-localadmins $_} -ErrorAction Stop 
$servers=$servers | Where-Object {$_ -notlike "*svcSCCM*"}   
$servers=$servers | Where-Object {$_ -notlike "*rol_*"}  
$servers=$servers | Where-Object {$_ -notlike "*Domain*"}  
$servers=$servers | Where-Object {$_ -notlike "*Support89*"}  
$servers=$servers | Where-Object {$_ -notlike "*Lokale*"}  
$servers
}
else{
Write-Host "Rechner nicht erreichbar "  
}
}


get-wmiobject : Der RPC-Server ist nicht verfügbar. (Ausnahme von HRESULT: 0x800706BA)
In C:\Users\Fiedlerflo\Documents\Adminrechte-abfragen.ps1:9 Zeichen:12
+   $group = get-wmiobject win32_group -ComputerName $computerName -Fil ...
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], COMException
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Content-ID: 515702

Url: https://administrator.de/contentid/515702

Ausgedruckt am: 25.11.2024 um 16:11 Uhr

141815
141815 16.11.2019 aktualisiert um 11:15:07 Uhr
Goto Top
Der Fehler taucht in Zeile 09 auf aber ich kann ihn mit Zeile 12 nicht abfangen und Leserlich darstellen
Weil die Shell einfach weitermacht als wäre nichts gewesen wenn du ihr nicht sagst was sie bei einem Fehler machen soll, dafür gibt's den ErrorAction Parameter, oder auch Global die Variable $ErrorActionPreference
Get-WmiObject ........... -ErrorAction Stop
Das Stop beim CMDLet innerhalb des Try Catch Blocks sorgt dafür daß das CMDLet bei einem Fehler eine Exception schmeißt und damit auch den Catch-Teil triggert.
fritzo
Lösung fritzo 17.11.2019 aktualisiert um 23:24:57 Uhr
Goto Top
Hallo Florian,

versuch es so:

 
try{
        $filter = "LocalAccount=True AND SID='S-1-5-32-544'"  
	$group = get-wmiobject win32_group -ComputerName $computerName -Filter $filter -ErrorAction Stop
  }
  catch{
	if ($_.Exception.GetType().Name -eq "COMException") {  
	Write-Host "RPC auf $computerName nicht aktiv"  
  }

Viele Grüße,
Fritz
ADMWoNh
ADMWoNh 18.11.2019 um 09:18:51 Uhr
Goto Top
Danke Fritz,
das hat funktioniert.
141815
141815 18.11.2019 aktualisiert um 09:42:54 Uhr
Goto Top
War ja das selbe was ich oben geschrieben habe, -EA Stop bringt den Effekt, man hätts ja nur mal lesen brauchen...
fritzo
fritzo 19.11.2019 um 23:34:02 Uhr
Goto Top
@141815
Wurde gelesen. Relevant in meinem Post ist der Exception-Handler, darüber hinaus wollte ich's ihm passend für sein Script zurechtbauen.
Wobei, wo Du es gerade ansprichst... wenn wir -ErrorAction Stop verwenden, dann sollte in den Catch-Block noch ein Continue. Schnipp:

try{
        $filter = "LocalAccount=True AND SID='S-1-5-32-544'"  
	$group = get-wmiobject win32_group -ComputerName $computerName -Filter $filter -ErrorAction Stop
  }
  catch{
	if ($_.Exception.GetType().Name -eq "COMException") {  
	Write-Host "RPC auf $computerName nicht aktiv"  
	Continue
  }