3

私には数百人のユーザーがいて、それぞれがファイルサーバー上のさまざまな場所/フォルダーにドライブを手動でマップしています。

私はデータを新しい名前の新しいサーバーに移行していますが、同じフォルダー構造を維持しているため、ドライブの再マッピングをスクリプト化する必要があります。均一なマッピングパターンに従っている場合は、単純なスクリプトでこれを行うことができますが、私が言うようにすべて独自の手動マッピングです。

したがって、現在のマッピングを調べて、サーバー名を\ server1.ourdomain\whateverパスから\server2.ourdomain\ whateverパスなどに変更する必要があります。構造が非常に優れているため、パスはさまざまなフォルダーとレベルになります。深くて複雑。

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との両方からドメイン部分を削除するか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

上記のスクリプトにはわずかな問題があります(実際には、スクリプトが適用されている場所ではありません)。

ユーザーがFQDN\server1.ourdomainではなく\server1などの短い名前でドライブをマップした場合、スクリプトは機能せず、単に無視されます。

ショートネームを「古い名前」変数として使用するようにスクリプトを変更すると、ショートネームでマップされたドライブで機能しますが、FQDNでエラーが発生し、FQDNドライブのマップを解除して再マップできません。

サーバー名がすでに変更されているため、最初にFQDNを再マッピングしてから、長い名前でエラーが発生しないため、短い名前を再マッピングすることでこれを回避しました。これを行うには、より雄弁な方法があると確信していますが、スクリプトを短い名前で再適用しただけです。以下のように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 

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つの例外を除いて正常に動作します。ユーザーが\server1に複数のドライブをマップしている場合、ユーザーのWindowsエクスプローラーまたはコンピューターでは、1つのドライブへの変更のみが反映されますが、「netuse」を使用するようにすべてのドライブが正しく再マップされます。のコマンドは、それらすべてのマッピングが変更されたことを示していますか?

ログオフしてログオンすると、エクスプローラーにすべてのドライブが新しい​​名前で正しく表示されて正しく反映されるため、エクスプローラーの表示に関する奇妙な問題のようです.........非常に奇妙でアイデアはありますか?

自分で試してみると、1つのドライブを短いドライブにマッピングし、1つのドライブを長いドライブにマッピングしてこれをテストし、両方を更新しますが、1つの変更のみが表示されるのでわかりますか?

于 2012-09-12T15:52:59.897 に答える