web-dev-qa-db-ja.com

現在のユーザーのマップされたネットワークドライブを一覧表示するスクリプト

私はWindowsXP/Server 2003環境を使用しています。ここでは、ユーザーが任意のドライブ文字を使用してさまざまなネットワークドライブをマップしています。これらのユーザーの中には、これらのドライブの実際のUNCパスを伝える方法を知らない人もいます。スクリプトまたはプログラムを実行して、これらのドライブにクエリを実行し、ドライブ文字と対応するUNCパスを表示できるようにしたいと思います。そのユーザーのコンテキストで「NetUse」のような出力を表示して、どのドライブがマップされているかを確認できるようにしたいと思います。自分の管理者アカウントを使用してこれを行う必要がありますが、そこに問題があります。この情報がHKCUレジストリに保存されることを理解していますか? Powershellでこれを実行できるようにしたいと思いますが、vbscriptまたはスタンドアロンの実行可能ファイルでも実行できます。ありがとう。

1
Dmart

あなたが探している鍵はここにあります:

\\HKCU\Network

マップされた各ドライブは、ドライブ文字にちなんで名付けられたレジストリキーで表されます。マッピングのプロパティは値に含まれています-あなたが最も興味を持っている可能性が高いものは次のとおりです:

RemotePath REG_SZ
UserName   REG_SZ

キーは持続的接続にのみ存在します。レジストリで一時的なマッピングを見つけることはできないと思います。

このアプローチの最大の問題は、ユーザーがログインしているときにユーザーマシンにリモート接続するか、ユーザープロファイルを接続して列挙し、それらをSIDにマップしてから、HKEY_USERSの下の関連するキーを検索しての関連するコピーを見つける必要があることです。ユーザーのハイブ。これは少し手間がかかるでしょうし、たくさんやろうと思ったらかなり遅くなるかもしれません。

これが定期的なサポートの問題である場合は、次のようなバッチファイルへのリンクを提供してください。

Net Use > \\someserver\someshare\%username%.drives

次に、共有でUsername.drivesファイルを探して、必要なものの正確なコピーを探します。それをログオンスクリプトに投げると、定期的に更新されるコピーがありますが、本当に情報が必要ない場合は、明らかにそれを行いたくありません。

追加するために編集Powershellスクリプトを使用してこれを追求したい場合は、 このブログ投稿 によるHugoPeetersによるサンプルスクリプトがあります。はリモートレジストリに接続する方法を示していますが、HKEY_USERSで正しいキーを選択できるように、ユーザー名をSIDにマップする方法を理解する必要があります。ターゲットマシンにプロファイルを持つ各ユーザーは、SIDで名前が付けられたキーの下に保存されたHKCUキーのコピーを持っています。適切なキーを見つけて、その下からネットワークキー情報を取得する必要があります。

4
Helvick

C:\ Workstations.txtにすべてのワークステーションのリストがあるとすると、Powershellを使用して各コンピューターのWMIにクエリを実行し、ログオンしたユーザーの現在のマッピングをコンピューターにちなんで名付けられたテキストファイルに出力できます。

# Load list into variable, which will become an array of strings
$computerlist = Get-Content C:\Workstations.txt

# Prompt for credentials that have rights to access WMI on the computers
$cred = Get-Credential

# Loop through each item in the array (each computer in the list of computers we loaded into the variable)
ForEach ($computer in $computerlist)
{
  # Query WMI on computer using credentials and output to file with width setting so we see everything
  Get-WmiObject Win32_NetworkConnection -computerName $computer -credential $cred | Select LocalName,RemoteName | Out-File C:\WorkstationMappings\$env:username.txt -width 120
}
2
Kai

WMI/VBScriptでは、現在のユーザーのマップされたドライブを一覧表示するために必要なビットは次のとおりです。

Set objNetwork = WScript.CreateObject("WScript.Network")
Set colDrives = objNetwork.EnumNetworkDrives
For i = 0 to colDrives.Count-1 Step 2
 Wscript.Echo colDrives.Item(i) & vbTab & colDrives.Item (i + 1)
Next

それは明らかに、それが実行されているマシンに現在ログオンしているユーザーのそれらのみをリストします。

現在、すべてのユーザーのマップされたドライブを検出するための演習を実行しており、各ユーザーのコンテキストでこのようなスクリプトを実行して、その情報を取得し、ファイルを取得して別のスクリプトで解析できるネットワーク共有にダンプします。後で:

scriptVersion = "1.0"

Set objShell = CreateObject("WScript.Shell")
Set objEnv = objShell.Environment("Process")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objNetwork = CreateObject("WScript.Network")

strUserName = objEnv("USERNAME")
strComputerName = lcase(objEnv("COMPUTERNAME"))
bPath = "\\servername\sharename"    ' Server and path to save files
bFile =  bPath & "\" & strComputerName &"-" & strUserName & "-NetDrives.txt"

'Setup output file
If objFSO.FileExists(bFile) then
    Set objTextFile = objFSO.OpenTextFile(bFile, 8, True)   ' 8 = appending
Else
    Set objTextFile = objFSO.OpenTextFile(bFile, 2, True)   ' 2 = writing
End if

objTextFile.WriteLine Now & " ::: Drive mappings listing v" & scriptVersion

'Loop through current network drives
Set colDrives = objNetwork.EnumNetworkDrives
For i = 0 to colDrives.Count-1 Step 2
 objTextFile.WriteLine colDrives.Item(i) & vbTab & colDrives.Item (i + 1)
Next


Set objShell = Nothing
Set objFSO = Nothing
Set objNetwork = Nothing

Wscript.Quit(ExitErrorLevel)

次に、これをログインスクリプトに挿入するか、Microsoft SMS/SCCMなどのソフトウェア配布ツールで実行できます。

0
GAThrawn