原文06年发表在CU博客上,原文名为《禁用-启用网络连接》这篇文章是我废弃的CU博客上的文章,很早以前发表的感觉不错所以挪过来了。
 
作系统管理员已经近两年了,通过mstsc登陆到IDCServer上进行远程管理成了每天例行的公事。IDC通常会分给托管服务器一段IP,比如我们公司的netmask255.255.255.192,可用的IP地址是XXX.XXX.XXX.129~XXX.XXX.XXX.190,其中分给我们公司的是XXX.XXX.XXX.146/26~XXX.XXX.XXX.160/26一共15个公网IP。有的时候根据业务需求,需要将不同的IP地址绑定到不同的网卡或者服务器上。而Windows网络设置管理方面通常需要重新启动计算机才能够生效。这样服务器非计划停机而出现的中断服务的情况是我们所不想看到的。那么怎样尽量减少中断服务时间让访问者感觉无缝联接,又能使修改的设置生效呢?
  我想到了用脚本禁用启用网卡的方式实现。如果在local computer启用禁用网络设备当然很容易,通过图形界面就可以实现。但是终端连接的服务器这样做无异于commit suicideserver上如果有两块网卡且都有公网IP倒是好说,一个不行了连另一个也可以。但是往往在server应用上是一块网卡对公网客户提供访问服务,另一块则通常是为前端的web servercachepower或者squid与内部应用如数据库等提供通信。如果公网那块网卡被禁用,可就有×××烦了,但至少还可以连到同在一个局域网的其他server上,通过内部地址连上服务器再enable disabled network card。要是server只有一块网卡那就非得去一趟IDC才行了。
  说了这么多废话就来看看这个脚本是怎么写的吧,
 
Const ssfCONTROLS = 3
'网络适配器的名字,默认应该叫本地连接
sConnectionName = "lan"
'下面两行都要根据实际情况,看一下图形界面下的是停用还是禁用,不同的系统不太一样
'&后面加的是对应动作的代表字母
sEnableVerb = "启用(&A)"
sDisableVerb = "
停用(&B)"
set shellApp = createobject("shell.application")
set oControlPanel = shellApp.Namespace(ssfCONTROLS)
set .etConnections = nothing
for each folderitem in oControlPanel.items
  if folderitem.name  = "
网络连接" Then 
'开始设置中的网络设备管理器同名,应该都叫网络连接吧,不一样改一下就好
  set .etConnections = folderitem.getfolder: exit for
  end if
next
if .etConnections is nothing then
  msgbox "Couldn't find 'Network Connections' folder"
  w..quit
end if
set oLanConnection = nothing
for each folderitem in .etConnections.items
  if lcase(folderitem.name)  = lcase(sConnectionName) then
    set oLanConnection = folderitem: exit for
  end if
next
if oLanConnection is nothing then
  msgbox "Couldn't find '" & sConnectionName & "' item"
  w..quit
end if
bEnabled = true
set oEnableVerb = nothing
set oDisableVerb = nothing
s = "Verbs: " & vbcrlf
for each verb in oLanConnection.verbs
  s = s & vbcrlf & verb.name
  if verb.name = sEnableVerb then
    set oEnableVerb = verb 
    bEnabled = false
  end if
  if verb.name = sDisableVerb then
    set oDisableVerb = verb 
  end if
next
if bEnabled then
  oDisableVerb.DoIt
end if
w..sleep 5000
bEnabled = true
for each verb in oLanConnection.verbs
  s = s & vbcrlf & verb.name
  if verb.name = sEnableVerb then
 set oEnableVerb = verb 
 bEnabled = false
  end if
  if verb.name = sDisableVerb then
 set oDisableVerb = verb 
  end if
next
 oEnableVerb.DoIt
w..sleep 1000