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-Key: 515702

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

Printed on: April 26, 2024 at 00:04 o'clock

Mitglied: 141815
141815 Nov 16, 2019 updated at 10:15:07 (UTC)
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.
Member: fritzo
Solution fritzo Nov 17, 2019 updated at 22:24:57 (UTC)
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
Member: ADMWoNh
ADMWoNh Nov 18, 2019 at 08:18:51 (UTC)
Goto Top
Danke Fritz,
das hat funktioniert.
Mitglied: 141815
141815 Nov 18, 2019 updated at 08:42:54 (UTC)
Goto Top
War ja das selbe was ich oben geschrieben habe, -EA Stop bringt den Effekt, man hätts ja nur mal lesen brauchen...
Member: fritzo
fritzo Nov 19, 2019 at 22:34:02 (UTC)
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
  }