在多台机器上将所有网卡更改为自动/自动

在多台机器上将所有网卡更改为自动/自动

由于网络设备发生变化,我可能需要将一组机器的 NIC 重新设置为自动协商。自动化此操作的最佳方法是什么?我正在考虑通过组策略或 SCCM 推出 Autoit 编译的 exe。如果您有示例,请发布您的脚本。我不确定我遇到的所有系统是否都具有相同的 NIC,因此将所有已知卡重置为自动的某种方法会很棒。

谢谢!-马修

答案1

这是可以完成您所需任务的脚本。不过,您需要做一些“功课”才能使其工作:

Option Explicit

Const HIVE_HKLM = &H80000002
Const REG_DEVICE_PATH = "SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}"
Const DEBUGGING = 1

Dim objRegistry, arrSubkeys, strSubkey, strComputer, regexpSubkey, strValue, dictDriverChanges, strDriverName

Set dictDriverChanges = CreateObject("Scripting.Dictionary")

' For each given NIC, add an item for the driver description string (case insensitive match) and the value name and value that
' should be set in the NIC's properties
Set dictDriverChanges.Item("Broadcom NetXtreme 57xx Gigabit Controller") = CreateObject("Scripting.Dictionary")
dictDriverChanges.Item("Broadcom NetXtreme 57xx Gigabit Controller").Add "ValueName", "*SpeedDuplex"
dictDriverChanges.Item("Broadcom NetXtreme 57xx Gigabit Controller").Add "Value", "0"


' Pattern to match on subkeys - exactly 4 digits
Set regexpSubkey = new Regexp
regexpSubkey.Global = True
regexpSubkey.Pattern = "\d{4,4}"

' Comptuer to run against. Set to "." for the local computer, or specify the computer-name of a remote machine
strComputer = "."

Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")

objRegistry.EnumKey HIVE_HKLM, REG_DEVICE_PATH, arrSubkeys

' Did we get back any strSubkeys?
If IsArray(arrSubkeys) Then
    For Each strSubkey In arrSubkeys

        ' Is this a subkey we want to look at
        If regexpSubkey.Execute(strSubkey).Count = 1 Then 
            objRegistry.GetStringValue HIVE_HKLM, REG_DEVICE_PATH & "\" & strSubkey, "DriverDesc", strValue

            ' Loop through all the drivers we know about looking for this driver
            For Each strDriverName in dictDriverChanges
                If UCase(strDriverName) = UCase(strValue) Then
                    If DEBUGGING = 1 Then WScript.Echo "Located driver " & strValue & ". Setting value " & dictDriverChanges.Item(strDriverName).Item("ValueName") & " to " & dictDriverChanges.Item(strDriverName).Item("Value")
                    objRegistry.SetStringValue HIVE_HKLM, REG_DEVICE_PATH & "\" & strSubkey, dictDriverChanges.Item(strDriverName).Item("ValueName"), dictDriverChanges.Item(strDriverName).Item("Value")
                End If
            Next ' strDriverName
        End If

    Next ' strSubkey
End If

您需要找到要更改的每种 NIC 的“DriverDesc”值。(在注册表中查看 REG_DEVICE_PATH 下的每个子项,以找到各种 DriverDesc 值)。我在脚本中提供了 Broadcom 57xx 控制器的说明。您需要确定每种 NIC 的注册表值名称和值设置,然后为每种 NIC 添加条目,如第 11-15 行中的条目。

现在,它针对本地计算机运行。让它在命令行上获取计算机名称并针对远程计算机运行并不难。或者,您也可以在每台机器上本地运行它。

脚本运行后,您需要重新启动计算机以使更改生效。如果您在 Windows Vista 或 Windows 7 上运行此脚本,请注意它必须在“提升”环境中运行。(它是在 Windows 7 上开发的,在 Windows XP 上运行良好......)

这应该能帮你解决问题。

答案2

我已经有一段时间没有做过这样的事情了,但是我相信改变这种方法的方法会因每个 NIC 卡而异,并且可能因每个 NIC 驱动程序的版本而异。

我认为处理这个问题的最佳方法是更改​​注册表。如果你的 PC 型号不超过十几种,那么这可能不是那么难,否则,就太糟糕了。

答案3

可能最好的选择是 WMI 脚本。

以下是一个例子首先,它会读取网卡信息。为远程计算机设置这些信息很容易 - 将 computername 变量更改为数组,循环遍历它们,然后调用 set 方法而不是 get 方法。

serverfault 上已经有几个 WMI 脚本的示例。

答案4

在这里,我将反其道而行之,建议您手动进行更改。预先将新设备配置为与旧设备相同的设置(100/full 或其他),然后逐个重置网络设备和计算机。这是一项非常繁琐的工作,但最好确保一切都正常,而且您只需执行一次。

人非圣贤,孰能无过,要想真正把事情搞砸,就需要一个脚本。

相关内容