function Get-OpenFilesOnServers {
<#
.SYNOPSIS
Получает информацию об открытых файлах на SMB-шарах указанных серверов.
.DESCRIPTION
Функция последовательно опрашивает каждый сервер из списка $Servers
с помощью Invoke-Command и командлета Get-SmbOpenFile.
Для работы требуется, чтобы на удалённых серверах был включён WinRM
и у учётной записи были права администратора.
.PARAMETER Servers
Массив имён или IP-адресов серверов.
.EXAMPLE
Get-OpenFilesOnServers -Servers $Servers
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string[]]$Servers
)
# Хэш-таблица для накопления результатов
$allOpenFiles = @()
foreach ($server in $Servers) {
Write-Verbose "Опрос сервера: $server"
try {
$result = Invoke-Command -ComputerName $server -ScriptBlock {
# Получаем все открытые файлы на SMB-шарах
Get-SmbOpenFile -ErrorAction Stop |
Select-Object @{Name='Server';Expression={$env:COMPUTERNAME}},
FileId,
SessionId,
ClientComputerName,
ClientUserName,
Path,
ShareRelativePath
} -ErrorAction Stop
$allOpenFiles += $result
}
catch {
Write-Warning "Не удалось получить данные с сервера $server : $_"
}
}
# Возвращаем результат в виде таблицы
if ($allOpenFiles.Count -gt 0) {
$allOpenFiles | Format-Table -AutoSize
}
else {
Write-Host "На указанных серверах открытых файлов не обнаружено."
}
}