如何通过CustomScriptExtension批量删除Azure平台上Windows虚拟机内部的隐藏网卡(Ghost/Hidden NIC)

如何通过CustomScriptExtension批量删除Azure平台上Windows虚拟机内部的隐藏网卡(Ghost/Hidden NIC)

问题描述:

通过镜像文件(无论是 Azure平台提供的还是用户自行制作的)创建的虚拟机,开机后使用设备管理器查看网卡,当选择“显示隐藏的设备”时,会发现有隐藏的网卡出现。通常情况下,隐藏网卡不会引起其他问题,但是如果一些第三方开发的软件应用与操作系统底层的网卡有关联,可能会受隐藏网卡影响,出现异常。因此需要删除隐藏网卡。

注意:删除单台虚拟机的隐藏网卡可以通过设备管理器直接卸载,但本文主要针对虚拟机数量比较多,需要批量删除的场景。

解决方案:

Azure平台为使用者提供CustomScriptExtension工具,此工具通过平台为虚拟机安装的Agent,将一些基本命令或是脚本推送到虚拟机操作系统内部。

以下将为使用者做详细介绍。

准备条件:

1.Windows Azure Agent必须已经安装在虚拟机上

2.Azure Powershell相关模块已经被导入

3.通过Powershell登录Azure portal账户

执行步骤:

1.首先,通过RDP登录到虚拟机,通过设备管理器,打开“显示隐藏的设备”,确认有隐藏网卡存在于操作系统内部,如图:

 

 

 

2.可以在设备管理器中,直接卸载,本文针对大量虚拟机,需要批量删除隐藏网卡的场景,即考虑到逐台删除,工作量非常大,故通过在Powershell中创建CustomScriptExtension来删除。

目前,中国区Azure portal在虚拟机页面中的子页面:“扩展”中,还未提供CustomScriptEstension扩展,如图:

 

 

 

Global Azure已经在Portal中提供,未来在中国区也会提供出来。

虽然中国区Azure无法提供在Portal中添加CustomScriptEstension扩展,但支持通过powershell添加Custom Script Extension扩展,从而删除虚拟机内部的隐藏网卡,Powershell命令如下:

 

Set-AzureRMVMextension -ResourceGroupName resourcegroupname -E -VMName vmname -Name customscriptextensionname -Publisher Microsoft.Compute -ExtensionType CustomScriptExtension -TypeHandlerVersion 1.8 -Location ChinaNorth -settingstring '{"commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -command  C:\\windows\\system32\\RUNDLL32.exe c:\\windows\\system32\\pnpclean.dll,RunDLL_PnpClean \/Devices \/Maxclean"}'

注:其实可以通过powershell命令:C:\windows\system32\RUNDLL32.exe c:\windows\system32\pnpclean.dll,RunDLL_PnpClean /Devices /Maxclean

在虚拟机内部的powershell中删除隐藏网卡。但是通过Azure Powershell模块执行命令:Set-AzureRMVMextension来创建customscriptextension的同时,通过commandToExecute来内嵌执行时,需要为符号字符转义,故您会看到如上命令涉及到路径时,多出了用来转义的反斜杠“\”。

接下来本文提供实际案例供读者参考:

Set-AzureRMVMextension -ResourceGroupName testRG -VMName Win2016cont1 -Name TestDeleteGhostNic -Publisher Microsoft.Compute -ExtensionType CustomScriptExtension -TypeHandlerVersion 1.8 -Location ChinaNorth -settingstring '{"commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -command  C:\\windows\\system32\\RUNDLL32.exe c:\\windows\\system32\\pnpclean.dll,RunDLL_PnpC

在运行此命令过程中,可以留意Portal中,虚拟机页面中的扩展子页面状态:

 

 

 

 

 

等待大约20秒,Powershell中会出现命令执行结果:

RequestId IsSuccessStatusCode StatusCode ReasonPhrase

--------- ------------------- ---------- ------------

                         True         OK   OK

 

如下图:

 

 

 

Portal同样观察到执行结果:

 

 

 

再回到虚拟机内部,提供设备管理器再次查看:

 

 

 

 

 

 

 

 

可以看到,点击“扫描检测硬件改动”后,隐藏网卡的确消失。

有了以上单台虚拟机删除隐藏网卡的成功经验,为我们提供了接下来批量删除隐藏网卡的可操作性的依据。

我们可以利用powershell脚本循环语句等方式批量删除虚拟机内部的隐藏网卡。

这里假设使用者的虚拟机名字是递增有规律的:

 

for($i = 1; $i -lt 4; $i++)

{

Set-AzureRMVMExtension -ResourceGroupName testRG -VMName web$i -Name Bing_hiddennic -Publisher Microsoft.Compute -ExtensionType CustomScriptExtension -TypeHandlerVersion 1.8 -Location ChinaEast -settingstring '{"commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -command  C:\\windows\\system32\\RUNDLL32.exe c:\\windows\\system32\\pnpclean.dll,RunDLL_PnpClean\/Devices

\/Maxclean"}'

};sleep 3

 

RequestId IsSuccessStatusCode StatusCode ReasonPhrase

--------- ------------------- ---------- ------------

                         True         OK OK

                         True         OK OK

                         True         OK OK

 

 

 

 

 

如果虚拟机名字不具备for循环的条件,使用者完全可以通过文本编辑器,将所有虚拟机名字插入此命令中,让powershell逐条执行此带有不同虚拟机名字的此命令。

有关Set-AzureRMVMExtension命令使用,可以参考Set-AzureRMVMExtension

posted @ 2019-12-25 14:40  Bing's  阅读(407)  评论(0)    收藏  举报