function Get-OpenFilesOnServers {
<#
.SYNOPSIS
Получает информацию об открытых файлах на SMB-шарах указанных серверов.
.DESCRIPTION
Функция выполняет командлет Get-SmbOpenFile на каждом сервере из списка
с помощью Invoke-Command и возвращает сводную таблицу с именем сервера,
пользователем, компьютером-клиентом, путём к файлу и относительным путём на шаре.
.PARAMETER ServerNames
Массив имён или IP-адресов серверов, на которых нужно проверить открытые файлы.
.PARAMETER Credential
(Необязательно) Учётные данные для подключения к серверам.
.EXAMPLE
Get-OpenFilesOnServers -ServerNames "my-dat-serv1","my-dat-serv2","my-dat-serv3"
.EXAMPLE
$servers = "my-dat-serv1","my-dat-serv2","my-dat-serv3"
Get-OpenFilesOnServers -ServerNames $servers -Credential (Get-Credential)
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string[]]$ServerNames,
[Parameter(Mandatory = $false)]
[System.Management.Automation.PSCredential]$Credential
)
$results = foreach ($server in $ServerNames) {
try {
$invokeParams = @{
ComputerName = $server
ScriptBlock = {
Get-SmbOpenFile |
Select-Object @{Name='Server';Expression={$env:COMPUTERNAME}},
ClientUserName,
ClientComputerName,
Path,
ShareRelativePath,
FileId,
SessionId
}
ErrorAction = 'Stop'
}
if ($Credential) {
$invokeParams.Credential = $Credential
}
Invoke-Command @invokeParams
}
catch {
Write-Warning "Не удалось получить данные с сервера '$server': $_"
}
}
$results | Sort-Object Server, ClientUserName, Path
}