我有几百个用户,每个用户都手动将驱动器映射到文件服务器上的各种位置/文件夹。
我正在用新名称将数据迁移到一个新服务器,但保持相同的文件夹结构,因此需要为其驱动器的重新映射编写脚本。如果它们遵循统一的映射模式,我可以用一个简单的脚本来完成,但正如我所说,它们都是唯一的手动映射。
因此,我需要询问他们当前的映射,并将服务器名称从\server1.ourdomain\whatever-path更改为\server2.ourdomain\whatever-path等。正如我所说,由于结构非常深入和复杂,路径大多指向各种文件夹和级别。
我打算使用VB脚本,并在用户网站上作为GPO运行它。
试试这样的东西:
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.ourdomainshare
更改为\server2.ourdomain.ourdomainshare
,这显然不起作用。从oldserver
和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
上面的脚本(不是真正的脚本,而是应用它的地方)有一个小问题:
如果用户通过短名称映射了驱动器,例如\server1,而不是FQDN\server1.ourdomain,那么脚本将不起作用,它只是忽略它。
如果我将脚本更改为使用短名称作为"旧名称"变量,则它适用于使用短名称映射但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
结束如果下一个
工作正常,只有一个例外,在用户的windows资源管理器或我的计算机中,当用户有多个驱动器映射到\server1时,它只反映了对1个驱动器的更改,但它已经正确地重新映射了所有驱动器,因为使用中的"net use"命令显示了所有驱动器的映射是否已更改?
如果他们注销并打开,它会通过在资源管理器中正确显示带有新名称的所有驱动器来正确反映,所以这似乎是一个奇怪的资源管理器显示问题。。。。。。。。。非常奇怪,有什么想法吗?
如果你自己尝试一下,你会发现我有几个人通过将一个驱动器映射到短驱动器和一个映射到长驱动器来测试这一点,它会同时更新两个驱动器,但只显示一个更改?