Мне нужно найти простой способ выкинуть товарищей по команде с сервера, если они забудут выйти из системы. Наш терминал имеет ограничение в 2 соединения. Я написал следующую функцию, чтобы получить зарегистрированных пользователей. Как я понимаю в PowerShell 2, есть более хорошие способы сделать это, но я застрял с версией 1 на данный момент.
Следующая функция позволит мне войти на сервер. (Если вы знаете более красивый способ сделать это, не стесняйтесь обучать меня. :) Я не доволен функционалом и надеюсь выучить у вас несколько хитростей.)
function get-terminal-users($serverName)
{
$path = "C:\ntui\source\i386"
cd -path $path
$result = invoke-expression -Command ".\quser.exe /SERVER:$serverName" | select -Skip 1
$a = @()
foreach($row in $result)
{
$d = new-object Object
$columns = $row.Replace(" ", " ").Split(" ") | ? {$_ -ne ""}
$d | add-member -membertype noteproperty -name UserName -value $columns[0]
$id = -1
$sessionName = ""
$columShift = 0
#this part was not ok and needed fixing. Thanks Winfred for the answer!
if([system.int32]::tryparse($columns[1].ToString(),[ref] $id))
{
$columShift --
}
else
{
$sessionName = $columns[1]
$id = [system.int32]::parse($columns[2].ToString())
}
$time = [DateTime]::Parse($columns[5 + $columShift] + " " + $columns[6 + $columShift])
$d | add-member -membertype noteproperty -name SessionName -value $sessionName
$d | add-member -membertype noteproperty -name ID -value $id
$d | add-member -membertype noteproperty -name State -value $columns[3 + $columShift]
$d | add-member -membertype noteproperty -name Idle -value $columns[4 + $columShift]
$d | add-member -membertype noteproperty -name Time -value $time
$a += $d
}
return $a
}
Так что мне нужен список, если пользователи, а затем я должен выгнать одного парня, если количество подключений превышает максимально допустимый. Если вы знаете способ получить эту информацию с сервера, я был бы очень признателен за вашу помощь.
$name = "myserver"
$maxConnections = 2
$users = get-terminal-users($name)
if($users.Count -eq $maxConnections)
{
$idList = $users | ? { $_.State -eq "Disc" } | select -First 1 | foreach { $_.ID }
foreach($id in $idList)
{
invoke-expression -Command ".\logoff.exe /SERVER:$name $id -V"
}
}
Проблема в том, что я могу взаимодействовать только с активными соединениями. Заброшенные соединения все еще используют доступные соединения, и я, кажется, не могу с ними что-то сделать. Пользователь со статусом Disc, кажется, использует терминальное соединение, и когда я по какой-то причине вызываю logoff по его id, локальный процесс завершается. Есть ли способ избавиться от дисковых подключений?
rwinsta.exe также работает только с активными соединениями.
Я запускаю скрипт на XP и нацеливаюсь на сервер Win 2003.