Как я могу выкинуть самого длинного неактивного пользователя с удаленной машины с помощью powershell 1? - PullRequest
3 голосов
/ 29 февраля 2012

Мне нужно найти простой способ выкинуть товарищей по команде с сервера, если они забудут выйти из системы. Наш терминал имеет ограничение в 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.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вы неправильно добавляете $ id в пользовательский объект в этой строке:

$d | add-member -membertype noteproperty -name ID -value $id

У отключенных сеансов нет имени сеанса, см .:

quser.exe /SERVER:mycomputer
USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
winfred                                   2  Disc      4+21:05  2/28/2012 8:38 AM

И требуется $columShift, который есть у вас на всех ваших свойствах, кроме идентификатора Noteproperty.Из-за этого вы неправильно указываете идентификатор для logoff.exe, когда пытаетесь выйти из отключенного сеанса.

Вместо этой строки должно быть:

$d | add-member -membertype noteproperty -name ID -value $columns[2 + $columShift]
0 голосов
/ 03 марта 2012

Зачем это делать с PowerShell?Используйте правильный инструмент для работы.В этом случае это будет групповая политика.

http://social.technet.microsoft.com/Forums/eu/winserverTS/thread/620e7bbf-c49b-4ab4-98ab-98e2ce5e979f

...