dertowa
Goto Top

Netzwerkkarte entfernen - Powershell

Hallo zusammen,
ich durchforste bereits eine Weile das Netz, finde aber keine passende Powershelloption für mein Unterfangen und frage mich ob ich zu blöd bin zu suchen, oder ob es einfach nicht vorgesehen ist?

Ich habe hier einen Coreserver (Server 2022 Standard), der hat aktuell eine alte Quad-Port 1G Karte die durch eine neuere ersetzt werden soll.
nic

Natürlich könnte ich nun die neue einfach einstecken und bekäme dann Ethernet 7 bis 10, allerdings bin ich ein Freund der Ordnung und
wenn ich das planen kann würde ich gern Ethernet 3 bis 6 deinstallieren, die Karte tauschen und mich freuen, dass keine Ghost-Adapter mehr da sind.
Der Geräte-Manager steht mir nicht zur Verfügung und ein Remove- oder Delete- gibt es scheinbar nicht?

Ich hatte mal einen Powershell-Befehl gefunden der alle Netzwerkadapter löscht und alle Konfigurationen zurücksetzt - den finde ich leider auch nicht mehr (man sollte sich alle guten Befehle notieren).

Vermutlich ist es mal wieder ganz easy wenn man weiß wie.

Grüße
ToWa

Content-ID: 2768046099

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

Ausgedruckt am: 24.11.2024 um 06:11 Uhr

MrCount
MrCount 13.05.2022 um 10:45:41 Uhr
Goto Top
Franz-Josef-II
Franz-Josef-II 13.05.2022 um 10:49:19 Uhr
Goto Top
Servas

Genau weiß ich es jetzt auch nicht, aber von der Logik her:

Remove-NetAdapter ..... und dann die Optionen anschauen
dertowa
dertowa 13.05.2022 um 10:51:03 Uhr
Goto Top
Salut,
naja da ist immer die Rede von "Disable", aber ich möchte ihn ja nicht deaktivieren, sondern deinstallieren/entfernen?

Bzgl. Ghost-Adapter (welche ich ja noch nicht habe, da ich mich vorher damit befasse) face-big-smile habe ich die Scripts auch entdeckt und war ein wenig verwundert, dass das offenbar so umständlich ist.
Mit GUI startet man den Geräte-Manager mit vorher gesetztem devmgr_show_nonpresent_devices und alles ist fein.

Grüße
dertowa
dertowa 13.05.2022 um 10:52:06 Uhr
Goto Top
Zitat von @Franz-Josef-II:
Remove-NetAdapter ..... und dann die Optionen anschauen

Salut,
so war auch mein Ansatz der verpufft aber leider sehr schnell...
remove
MrCount
MrCount 13.05.2022 um 10:59:21 Uhr
Goto Top
Zitat von @dertowa:

Salut,
naja da ist immer die Rede von "Disable", aber ich möchte ihn ja nicht deaktivieren, sondern deinstallieren/entfernen?


Du meinst also so in etwa?
https://superuser.com/questions/1544537/how-to-uninstall-install-the-nic ...
Crusher79
Crusher79 13.05.2022 um 11:04:24 Uhr
Goto Top
dertowa
dertowa 13.05.2022 um 12:19:04 Uhr
Goto Top
Wenn ich das richtig verstehe läuft es auf ein Löschen in der Registry hinaus.
Wozu ich mir die PNPDeviceID raussuche.

Das angegebene Script sollte man wohl nicht nutzen, da es wohl alles löscht, auch die Standard-Systemadapter.

Dann gibt es wohl wirklich keine "einfache" Lösung für das Deinstallieren was man über die GUI erledigt?
nic_del
MrCount
MrCount 13.05.2022 um 12:27:36 Uhr
Goto Top
Zitat von @dertowa:

Das angegebene Script sollte man wohl nicht nutzen, da es wohl alles löscht, auch die Standard-Systemadapter.

Naja, dafür ist ja auch der Kommentar unter dem Script:
NOTE: Your list of adapters at step 1 must ONLY contain adapters you want to purge. If you have extras in there, adjust the filter (? Status -eq XXX, eg: ? FriendlyName -like "Broadcom*") accordingly!
dertowa
dertowa 13.05.2022 aktualisiert um 12:46:29 Uhr
Goto Top
Zitat von @MrCount:
Naja, dafür ist ja auch der Kommentar unter dem Script:
NOTE: Your list of adapters at step 1 must ONLY contain adapters you want to purge. If you have extras in there, adjust the filter (? Status -eq XXX, eg: ? FriendlyName -like "Broadcom*") accordingly!

Nun da kommt dann wieder lesen & verstehen zum Einsatz.
Denn ich müsste ja was eintragen was ich habe...

adapter

Also sowas?
# Query the present and enabled Network Adapters for the PNPDeviceId value
[array]$PNPDeviceIds = (gwmi Win32_NetworkAdapter -Filter "ServiceName = e1express").PNPDeviceId;  
for ($i = 0; $i -lt $PNPDeviceIds.Count; $i++) {
    if ($SubKeys -NotContains $($PNPDeviceIds[$i].Split('\') + "\" + $PNPDeviceIds[$i].Split('\')[1])) {  
        $SubKeys += $($PNPDeviceIds[$i].Split('\') + "\" + $PNPDeviceIds[$i].Split('\')[1])  
    }
}

-Filter "ServiceName = e1express"
MrCount
MrCount 13.05.2022 um 12:56:58 Uhr
Goto Top
Zitat von @dertowa:

-Filter "ServiceName = e1express"

das sollte auch gehen:
Name -like "Intel*Quad*"  
dertowa
dertowa 13.05.2022 um 13:22:08 Uhr
Goto Top
Zitat von @MrCount:
das sollte auch gehen:
Name -like "Intel*Quad*"  

Das klappt nicht, es wurde kein Parameter gefunden, dem dem Parameternamen "-like" entspricht. face-wink
-Filter "Name = Intel*Quad*"  
will er auch nicht und mein ServiceName ist ebenfalls ungültig.
MrCount
MrCount 13.05.2022 um 13:33:27 Uhr
Goto Top
get-wmiobject win32_networkadapter | Where-Object {$_.Name -like "Intel*Quad*"}  
dertowa
dertowa 13.05.2022 aktualisiert um 13:39:51 Uhr
Goto Top
Zitat von @MrCount:

get-wmiobject win32_networkadapter | Where-Object {$_.Name -like "Intel*Quad*"}  

Danke, das klappt was die Ausführung angeht, landet aber nur im "else"-Zweig und vermeldet:
Unused Network Adapters not be found.

Ich sehe aber aus dem Script leider nicht, was er noch an Bedingungen benötigt? face-sad
...oder muss ich die Karte erst ausbauen, wenn ich da gerade sehe, dass er "non-present devices" löschen will.
MrCount
MrCount 13.05.2022 um 13:47:19 Uhr
Goto Top
Dein o.g. Script hat keinen else-Zweig...
Poste doch mal dein ganzes Script.
dertowa
dertowa 13.05.2022 aktualisiert um 14:14:14 Uhr
Goto Top
Zitat von @MrCount:

Dein o.g. Script hat keinen else-Zweig...
Poste doch mal dein ganzes Script.

Ah ich dachte wir sprechen über den Verweis von Crusher79 da sich darauf auch dein Kommentar:Netzwerkkarte entfernen - Powershell bezog. face-smile
Aber ja, das Ding ist offenbar nur um die nicht mehr aktiven Adapter zu entfernen:
https://stackoverflow.com/questions/31191105/using-powershell-to-remove- ...

Ich bau dann mal aus und teste. face-wink

Edit: Klappt nicht.
Zeile 11 im Script gefällt ihm nicht...
if ($SubKeys -NotContains $($PNPDeviceIds[$i].Split('\') + "\" + $PNPDeviceIds[$i].Split('\')[1])) {  
C.R.S.
Lösung C.R.S. 13.05.2022 um 13:56:18 Uhr
Goto Top
Zitat von @dertowa:

Dann gibt es wohl wirklich keine "einfache" Lösung für das Deinstallieren was man über die GUI erledigt?
nic_del

Nein, die gibt es meines Erachtens schon für das Installieren nicht (entsprechend dem Hardware-Assistent). Dazu ist immer noch die DevCon.exe nötig, die kann aber auch entfernen.
Die Ordnung könnte aber auch mit Rename-NetAdapter wiederhergestellt werden.

Grüße
Richard
dertowa
Lösung dertowa 13.05.2022 aktualisiert um 15:09:18 Uhr
Goto Top
Zitat von @c.r.s.:
Nein, die gibt es meines Erachtens schon für das Installieren nicht (entsprechend dem Hardware-Assistent). Dazu ist immer noch die DevCon.exe nötig, die kann aber auch entfernen.
Die Ordnung könnte aber auch mit Rename-NetAdapter wiederhergestellt werden.

Naja die Installation kann ja über das Setup des Herstellers erfolgen und/oder über PnPUtil.
Dann schau ich mir das mal mit DevCon an, das o.g. Script ist nämlich leider kein Selbstläufer. face-big-smile

Edit:
Perfekt und eigentlich ganz einfach. face-smile

  • devcon.exe auf das System übertragen
  • bspw. mit DeviceTool.exe remote nach der HWID schauen, in meinem Fall: PCI\VEN_8086&DEV_10BC&SUBSYS_10BC....
  • lokal den Befehl devcon.exe hwids *dev_10bc* ausführen und Ergebnis prüfen
  • entfernen mit: devcon.exe remove hwids *10bc*
  • mit get-netadapter prüfen ob die Adapter lost sind
colinardo
Lösung colinardo 13.05.2022, aktualisiert am 04.07.2022 um 12:04:23 Uhr
Goto Top
Zitat von @dertowa:
das o.g. Script ist nämlich leider kein Selbstläufer. face-big-smile
Nicht nur das auch die Berechtigungen würden dir beim Entfernen ein Bein stellen, da die Subkeys darin SYSTEM gehören und nicht ohne weitere Maßnahmen entfernt werden können ohne die Berechtigungen anzupassen. Hiermit lässt sich das bspw. machen

<#
    Remove old orphaned non present NICs
#>

# Which NICs should be removed
$nic_filter = '*Intel*Quad*'  

# restart elevated if needed
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}  

# function to take regkey ownership
function Take-RegKeyOwnership {
    param(
        [string]$rootKey,
        [string]$key,
        [System.Security.Principal.SecurityIdentifier]$sid = 'S-1-5-32-545',  
        [switch]$recurse
    )
    switch -regex ($rootKey) {
        'HKCU|HKEY_CURRENT_USER'    { $rootKey = 'CurrentUser' }  
        'HKLM|HKEY_LOCAL_MACHINE'   { $rootKey = 'LocalMachine' }  
        'HKCR|HKEY_CLASSES_ROOT'    { $rootKey = 'ClassesRoot' }  
        'HKCC|HKEY_CURRENT_CONFIG'  { $rootKey = 'CurrentConfig' }  
        'HKU|HKEY_USERS'            { $rootKey = 'Users' }  
    }

    Add-Type '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(int Privilege, bool Enable, bool CurrentThread, ref bool EnabledOut);' -name token -namespace privilege  
    9,17,18 | %{[void][privilege.token]::RtlAdjustPrivilege($_,1,0,[ref]0)}

    function Take-KeyPermissions {
        param($rootKey, $key, $sid, $recurse, $level = 0)

        $regKey = [Microsoft.Win32.Registry]::$rootKey.OpenSubKey($key, 'ReadWriteSubTree', 'TakeOwnership')  
        $acl = New-Object System.Security.AccessControl.RegistrySecurity
        $acl.SetOwner($sid)
        $regKey.SetAccessControl($acl)
        $acl.SetAccessRuleProtection($false, $false)
        $regKey.SetAccessControl($acl)

        if ($level -eq 0) {
            $regKey = $regKey.OpenSubKey('', 'ReadWriteSubTree', 'ChangePermissions')  
            $rule = New-Object System.Security.AccessControl.RegistryAccessRule($sid, 'FullControl', 'ContainerInherit', 'None', 'Allow')  
            $acl.ResetAccessRule($rule)
            $regKey.SetAccessControl($acl)
        }
        if ($recurse) {
            $regKey.OpenSubKey('').GetSubKeyNames() | %{Take-KeyPermissions $rootKey "$key\$_" $sid $recurse ($level+1)}  
        }
    }
  Take-KeyPermissions $rootKey $key $sid $recurse.IsPresent
}
# get date value as binary array
function Convert-DateTimeToRegistryDate([datetime]$dt = (get-date)) {
    $ft = $dt.ToFileTime()
    return ,[byte[]](0..7 | %{[byte](($ft -shr (8 * $_)) -band 0xFF)})
}

# filter orphaned NICs
foreach($nic in (Get-PNPdevice -class net | ?{$_.Status -eq 'Unknown' -and !$_.Present -and $_.FriendlyName -like $nic_filter})){  
    try{
        Write-host "Removing orphaned adapter '$($nic.FriendlyName)' ... " -F Green -NoNewline  
        # take ownership of key and subkeys
        Take-RegKeyOwnership -rootKey HKLM -key "SYSTEM\CurrentControlSet\Enum\$($nic.InstanceId)" -recurse  
        # remove key recursive
        Remove-Item "HKLM:\System\CurrentControlSet\Enum\$($nic.InstanceId)" -recurse -force  
        # remove additional references
        Remove-ItemProperty "HKLM:\System\CurrentControlSet\Control\DeviceContainers\{00000000-0000-0000-FFFF-FFFFFFFFFFFF}\BaseContainers\{00000000-0000-0000-FFFF-FFFFFFFFFFFF}" -Name $nic.InstanceId -Force -EA SilentlyContinue  
        Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}" -EA SilentlyContinue | ?{$_.GetValue('DeviceInstanceId') -eq $nic.InstanceId} | remove-item -Force -Recurse  
        Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Control\DeviceClasses\{cac88484-7515-4c03-82e6-71a87abac361}" -EA SilentlyContinue | ?{$_.GetValue('DeviceInstance') -eq $nic.InstanceId} | Remove-Item -Force -Recurse  
        # set last delete property value for class key
        Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}" -Name LastDeleteDate -Value (Convert-DateTimeToRegistryDate) -EA SilentlyContinue  
        write-host "OK" -F Green  
    }catch{
        write-host $_.Exception.Message -F Red
    }
}
Grüße Uwe
MysticFoxDE
MysticFoxDE 08.11.2024 um 23:45:11 Uhr
Goto Top
Moin Zusammen,

der Beitrag hier ist zwar schon länger gelöst, ich habe jedoch soeben eine etwas einfachere Methode zum Löschen von (bestimmten) Netzwerkkarten herausgefuchst. 😁

Alle NIC's löschen (mit Vorsicht zu geniessen):
$networkAdapters = Get-CimInstance -ClassName Win32_NetworkAdapter | Where-Object { $_.NetConnectionID -ne $null}

foreach ($adapter in $networkAdapters) {
    $pnpDeviceId = $adapter.PNPDeviceID
    if ($pnpDeviceId) {
        pnputil /remove-device $pnpDeviceId
        Write-Output "Netzwerkadapter '$($adapter.NetConnectionID)' mit PNPDeviceID '$pnpDeviceId' wurde gelöscht."  
    } else {
        Write-Output "PNPDeviceID für Netzwerkadapter '$($adapter.NetConnectionID)' nicht gefunden."  
    }
}

Bestimmte NIC's löschen:
$networkAdapters = Get-CimInstance -ClassName Win32_NetworkAdapter | Where-Object { $_.NetConnectionID -ne $null -and $_.Name -like "Intel(R) Ethernet Network Adapter X710*" }  

foreach ($adapter in $networkAdapters) {
    $pnpDeviceId = $adapter.PNPDeviceID
    if ($pnpDeviceId) {
        pnputil /remove-device $pnpDeviceId
        Write-Output "Netzwerkadapter '$($adapter.NetConnectionID)' mit PNPDeviceID '$pnpDeviceId' wurde gelöscht."  
    } else {
        Write-Output "PNPDeviceID für Netzwerkadapter '$($adapter.NetConnectionID)' nicht gefunden."  
    }
}

Mit kleinen Änderungen, lassen sich damit aber auch andere Geräte löschen. 😉

Gruss Alex