3

我有数百个用户,每个用户都手动将驱动器映射到文件服务器上的各种位置/文件夹。

我正在将数据迁移到具有新名称但保持相同文件夹结构的新服务器,因此需要编写重新映射驱动器的脚本,如果它们遵循统一的映射模式,我可以使用简单的脚本来执行此操作,但正如我所说的那样都是独一无二的手工映射。

所以我需要询问他们当前的映射并将服务器名称从 \server1.ourdomain\whatever path 更改为 \server2.ourdomain\whatever path 等,因为我说路径主要是各种文件夹和级别,因为结构相当深刻而复杂。

我打算使用 VB 脚本并将其作为 GPO 在用户站点上运行。

4

2 回答 2

2

尝试这样的事情:

oldserver = "\\server1.ourdomain"
newserver = "\\server2.ourdomain"

Set net = CreateObject("WScript.Network")
Set drives = net.EnumNetworkDrives

For i = drives.Count - 1 To 0 Step -2
  If LCase(Left(drives(i), Len(oldserver))) = oldserver Then
    net.RemoveNetworkDrive drives(i-1), True, True
    net.MapNetworkDrive drives(i-1), Replace(drives(i), oldserver, newserver), True
  End If
Next

编辑:由于您的所有示例都附加了 .ourdomain,因此我假设您一直在使用 FQDN。如果还使用了 NetBIOS 名称,那么上面的脚本当然对它们不起作用。但是,你不能只缩短oldserver\\server1,因为那样的话指令

Replace(drives(i), oldserver, newserver)

会将 UNC 路径更改\\server1.ourdomain\share\\server2.ourdomain.ourdomain\share,这显然是行不通的。oldserver要么从and中删除域部分newserver,要么(如果要强制执行 FQDN)使用如下内容:

domain    = ".ourdomain"
oldserver = "\\server1"
newserver = "\\server2" & domain

Set net = CreateObject("WScript.Network")
Set drives = net.EnumNetworkDrives

For i = drives.Count - 1 To 0 Step -2
  net.RemoveNetworkDrive drives(i-1), True, True
  If InStr(1, drives(i), domain, vbTextCompare) > 0 Then
    newpath = Replace(drives(i), oldserver & domain, newserver)
  Else
    newpath = Replace(drives(i), oldserver, newserver)
  End If
  net.MapNetworkDrive drives(i-1), newpath, True
Next
于 2012-09-10T13:03:54.203 回答
0

上面的脚本有一个小问题(实际上不是脚本,更多的是它被应用的地方)是:

如果用户已通过短名称映射驱动器,例如 \server1 而不是 FQDN \server1.ourdomain,则脚本将不起作用,它只是忽略它。

如果我将脚本更改为使用短名称作为“旧名称”变量,那么它适用于使用短名称映射但 th3e FQDN 错误的驱动器,并且取消映射无法重新映射它的 FQDN 驱动器。

我已经通过首先重新映射 FQDN 然后是短名称来解决这个问题,因为它们不会因为服务器名称已经更改而出现长名称错误,我确信有一种更雄辩的方法可以做到这一点,但我只是重新应用了短名称的脚本在第二遍如下:

oldserver = "\\server1.ourdomain" 
newserver = "\\server2.ourdomain" 

Set net = CreateObject("WScript.Network") 
Set drives = net.EnumNetworkDrives 

For i = drives.Count - 1 To 0 Step -2 
  If LCase(Left(drives(i), Len(oldserver))) = oldserver Then 
    net.RemoveNetworkDrive drives(i-1), True, True 
     net.MapNetworkDrive drives(i-1), Replace(drives(i), oldserver, newserver), True 
  End If 
Next 

oldserver = "\\Server1" 
newserver = "\\server2.ourdomain" 

Set net = CreateObject("WScript.Network") 
Set drives = net.EnumNetworkDrives 

For i = drives.Count - 1 To 0 Step -2 
If LCase(Left(drives(i), Len(oldserver))) = oldserver Then 
net.RemoveNetworkDrive drives(i-1), True, True 
net.MapNetworkDrive drives(i-1), Replace(drives(i), oldserver, newserver), True 

如果下一个则结束

工作正常,有 1 个例外,在用户 Windows 资源管理器或我的计算机中,当用户将多个驱动器映射到 \server1 时,它仅反映对 1 个驱动器的更改,但它已正确重新映射所有驱动器,因为使用“网络使用”中的命令显示所有映射都已更改?

如果他们注销并通过在资源管理器中以新名称正确显示所有驱动器来正确反映,那么这似乎是一个奇怪的资源管理器显示问题......非常奇怪,有什么想法吗?

如果您自己尝试一下,您会看到,因为我有几个人通过将一个驱动器映射到短驱动器并将一个驱动器映射到长驱动器来测试它,并且它会更新两者但只显示一个更改?

于 2012-09-12T15:52:59.897 回答