Получите удаленных пользователей, вошедших в систему, и выдайте команду при обнаружении с помощью PowerShell

Я хочу создать сценарий PowerShell, который будет видеть, зарегистрирована ли локальная учетная запись пользователя на удаленной машине. Если это так, он выведет сообщение о том, что пользователь вошел в систему. Если пользователь не вошел в систему, он откроет mstsc, чтобы пользователь мог войти в систему.

Приведенный ниже код, который я нашел, отлично работает, но, похоже, он видит только учетные записи домена. И оттуда я не уверен, как передавать результаты и отвечать в зависимости от того, вошел ли пользователь в систему или нет.

@(Get-WmiObject -ComputerName $machine -Namespace root\cimv2 -Class Win32_ComputerSystem)[0].UserName;

Обновленный код. В основном мне нужно увидеть, используется ли локальная учетная запись пользователя сеансом RDP. Имеет ли это смысл?

$machine = "ServerNameHere"
$temp1 = "C:\temp\user.txt"
$Word = "JDoe"

# The below command will connect to the server and see if user bouair is currently logged in

@(Get-WmiObject -ComputerName $machine -Namespace root\cimv2 -Class Win32_ComputerSystem)[0].UserName | Out-File $temp1 -Append


If((Get-Content $temp1).Contains($Word))
{
    [system.windows.forms.messagebox]::Show("another user is already logged in!");
}
else {
    .\mstsc.exe -v $machine
}

Remove-Item $temp1
exit

Одна из моих проблем с командой Get-WmiObject заключалась в том, что она не загружала сеансы RDP на моем сервере. Затем я наткнулся на блог, где пользователи использовали quser для получения всех пользователей, затем я изменил код, чтобы он работал в моей среде. этот код отлично работает для нашей группы, и другие могут извлечь из него пользу. следующий шаг — вытащить время простоя и состояние в блок сообщений, но это на другой день.

param( $ComputerName = 'ServerNameNere' )

process {
    $File1 = "C:\temp\user.txt"
    $word = "UserNameHere"
    Remove-Item $File1
    foreach ($Computer in $ComputerName) {
        quser /server:$Computer | Select-Object -Skip 1 | ForEach-Object {
            $CurrentLine = $_.Trim() -Replace '\s+',' ' -Split '\s'
            $HashProps = @{
                UserName = $CurrentLine[0] | Out-File $file1 -Append
                ComputerName = $Computer | Out-File $file1 -Append
            }

            if ($CurrentLine[2] -eq 'Disc') {

                $HashProps.SessionName = $null | Out-File $file1 -Append
                $HashProps.Id = $CurrentLine[1] | Out-File $file1 -Append
                $HashProps.State = $CurrentLine[2] | Out-File $file1 -Append
                $HashProps.IdleTime = $CurrentLine[3] | Out-File $file1 -Append
                $HashProps.LogonTime = $CurrentLine[4..6] -join ' ' | Out-File $file1 -Append
            }
            else {

                $HashProps.SessionName = $CurrentLine[1] | Out-File $file1 -Append
                $HashProps.Id = $CurrentLine[2] | Out-File $file1 -Append
                $HashProps.State = $CurrentLine[3] | Out-File $file1 -Append
                $HashProps.IdleTime = $CurrentLine[4] | Out-File $file1 -Append
                $HashProps.LogonTime = $CurrentLine[5..7] -join ' ' | Out-File $file1 -Append
            }

            New-Object -TypeName PSCustomObject -Property $HashProps |
            Select-Object -Property UserName,ComputerName,SessionName,Id,State,IdleTime,LogonTime
        }
    }

    If((Get-Content $file1).Contains($Word))
    {
        [system.windows.forms.messagebox]::Show("another user is already logged in!");
    }
    else {
        mstsc.exe -v $machine
    }
}

person Bergie    schedule 21.05.2014    source источник


Ответы (2)


Поэтому я работал с тем, что у вас было, и удалил несколько вещей, которые на самом деле не нужны. Я расширяю список UserName и назначаю его $Users, поэтому у меня просто есть массив имен пользователей. Затем я проверяю, совпадает ли нужная учетная запись с какой-либо из них, и если да, то мы выводим окно сообщения, если нет, запускаем MSTSC.

$machine = "ServerNameHere"

# the below command will connect to the server and see all users currently logged in
$Users = Get-WmiObject -ComputerName $machine -Namespace root\cimv2 -Class Win32_ComputerSystem | Select -Expand Username

#This will check if bouair is one of those logged in users.
If($Users -Match "bouair"){
    [system.windows.forms.messagebox]::Show("another user is already logged in!")
}
else { #If it is not, start MSTSC to establish a remote session.
    .\mstsc.exe -v $machine
}

Дополнительная функция. Простая функция, которую я хотел бы иметь под рукой на случай, если мне понадобится открыть окно сообщения:

Function Show-MsgBox ($Text=$(Throw "You must supply the text for the message box."),$Title,[Windows.Forms.MessageBoxButtons]$Button = "OK",[Windows.Forms.MessageBoxIcon]$Icon = "Information"){
[Windows.Forms.MessageBox]::Show("$Text", "$Title", [Windows.Forms.MessageBoxButtons]::$Button, [Windows.Forms.MessageBoxIcon]::Information) | ?{(!($_ -eq "OK"))}
}

Затем вы можете просто сделать Show-MsgBox "Another user is logged on!", и он появится вместе с этим. Вы также можете указать заголовок окна, если хотите, и указать, какие кнопки или значок, если это необходимо (ввод -Button или -Icon IntelliSense ваши варианты, и завершение табуляции доступно для этого параметра).

person TheMadTechnician    schedule 21.05.2014
comment
Спасибо, после этого я думаю, что это именно то, что мне нужно, однако, когда я выполняю это, он продолжает выдавать ошибку в строке 4, есть только одна) прямо перед .UserName - person Bergie; 21.05.2014
comment
В строке: 4 символа: 96 + ... _ComputerSystem).UserName | Выберите -Expand Username + ~ Неожиданный токен ')' в выражении или операторе. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : UnexpectedToken - person Bergie; 21.05.2014
comment
Извините, мой косяк, исправил. У меня было ).UserName, которое нужно было удалить, оставшееся от вашего кода. - person TheMadTechnician; 21.05.2014

person    schedule
comment
Пожалуйста, добавьте немного повествования вокруг вашего ответа, чтобы помочь ОП. - person geedubb; 21.05.2014
comment
Спасибо за ваш ответ, ниже то, что я придумал до сих пор. но около 15 пользователей вошли в систему с использованием RDP, мне просто нужно посмотреть, есть ли сеанс RDP для одной конкретной учетной записи локального пользователя на сервере. Имеет ли это смысл. - person Bergie; 21.05.2014