给定多个网络共享名快速查找文件夹路径的方法(Windows)

给定多个网络共享名快速查找文件夹路径的方法(Windows)

我目前正在分析组织中数千个主目录的位置。我运行了一个脚本,将每个用户及其主目录(共享名)导出到 csv 中。

Import-Module ActiveDirectory
Get-ADUser -SearchBase "OU=Users,DC=org,DC=com" -Filter * -Property * |
    Select-Object -Property sAMAccountName,homeDirectory|
        Export-CSV -Path C:\homedirs.csv

无论是通过修改此脚本还是对生成的文件进行操作,我如何才能产生相同的结果,但将每个共享替换为其所代表的实际路径?

还需要知道这些共享位于多台服务器上。

编辑:看起来返回的信息 wmic /node:<servernames> share可能有助于检查我已有的共享名称列表,但我该如何将其联系起来呢?

答案1

我将以类似以下方式完成任务:

  1. 将 AD 中的数据放入哈希表中。
  2. 循环,读取完整的共享路径(以及其他字段,以便能够将它们打印到新的 csv 中)。
  3. 从路径中使用以下方法从共享名中分离出服务器名:分割法
  4. 使用get-wmiobjectcmdlet 来调用服务器并获取本地路径使用上一步中提取的服务器名称和共享名称。
  5. 仅作为建议,将完整的共享路径、服务器、共享名称和本地共享路径输出到一个新的 csv 文件(即存储从原始文件中提取的所有内容,以防您发现它的其他用途)。
  6. 回送

然后可以对其进行优化,例如通过调用每个唯一的服务器一次并在本地批量执行该服务器的所有共享查询(invoke-command例如,使用和/或运行以workflow并行处理多个服务器)。

[编辑]这是一个基于上述步骤的具体示例。

主目录的输入应采用 \\servername\sharename\subdir 格式

在处理时,我选择仅对 \\servername\sharename 感兴趣

我选择的输出为 sAMAccountName;homeDirectory;ServerName;ShareName;ShareLocalPath

当然,您需要根据您所追求的目标来对此进行调整。

Import-Module -Name ActiveDirectory

$Cred = Get-Credential
$CsvFile = 'E:\temp49\homedirs2.csv'

# Read the data from AD into a hashtable.
if ($HashTable) {Remove-Variable HashTable}
$HashTable = Get-ADUser -Filter * -Property sAMAccountName, homeDirectory |
Select-Object -Property sAMAccountName, homeDirectory

# Iterate through the hashtable.
$HashTable | ForEach-Object `
{
  # Only process if the home directory has a value.
  if (-not($_.homeDirectory -eq $null)) `
  {
    # Convert the homedir and samaccountname into strings and store in variables.
    [string]$homeDirectory = $_.homeDirectory
    [string]$sAMAccountName = $_.sAMAccountName

    # Extract the servername and the sharename from the homedirectory path.
    [array]$homeDirectorySplit = $homeDirectory -Split [regex]::Escape(‘\’)
    $ServerName = $homeDirectorySplit[2]
    $ShareName = $homeDirectorySplit[3]
    # ...If more levels are needed just keep going.

    # Call the server to get the shares local path.
    $ShareLocalPath = ((Get-WmiObject -ComputerName $ServerName `
                      -Credential $Cred Win32_Share) |
    Foreach-Object { $_.Name -eq $ShareName }).Path

    # Print to a semicolon delimited file.
    "$sAMAccountName;$homeDirectory;$ServerName;$ShareName;$ShareLocalPath" |
    Out-File $CsvFile -NoClobber -Append
  }
}

如果这是一项严肃的工作,我会添加日志记录和错误检查。我会按照上面的建议优化服务器调用,并在使用 调用之前 ping 每个服务器Test-Connection。如果服务器数量非常多,我最终会考虑实现并行处理,所有这些都是为了可靠性、资源节约和执行速度。

相关内容