由于网络设备发生变化,我可能需要将一组机器的 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 或其他),然后逐个重置网络设备和计算机。这是一项非常繁琐的工作,但最好确保一切都正常,而且您只需执行一次。
人非圣贤,孰能无过,要想真正把事情搞砸,就需要一个脚本。