2015-08-03 10 views
1

Я использую функцию Get-LoggedOnUser из Technet Script Center Microsoft Repository: Get-LoggedOnUserОтправить выскочит сообщение для определенных пользователей RDP, которые не авторизованы от

Я имею ссылающегося на "сообщение" Command (Net Send) на моем RDP-сервере, чтобы отправить всплывающее сообщение любому пользователю, который не вышел из системы за одну ночь.

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

$yesterday = [DateTime]::Today.ToString('M/d/yyyy HH:mm ') 

$NotLoggedOut = Get-LoggedOnUser -ComputerName COMPUTERNAME | Where-Object {$_.LogonTime -lt $yesterday} 

$Script={param($Command, $Users, $ComputerName, $LogonTime); Write-Host $Command; &cmd /c "$Command"} 

$Command = Foreach($User in $NotLoggedOut){write-host "Dear " $User.username "the system shows that you have been logged on since " $User.LogonTime "REMINDER: You MUST Log off at the end of everyday"} 

Invoke-Command -ComputerName COMPUTERNAME -ScriptBlock $Script -ArgumentList $Command 

$ NotLoggedOut показывает три пользователей, которые получат Сообщи

UserName ComputerName  SessionName Id State IdleTime LogonTime    Error 
-------- ------------ ------------ -- ----- -------- ------------   ----- 
User01  COMPUTERNAME rdp-tcp#0  1 Active 5  7/30/2015 9:39 AM  
User02  COMPUTERNAME rdp-tcp#9  2 Active 10  7/30/2015 8:46 AM  
User03  COMPUTERNAME rdp-tcp#2  2 Active   7/30/2015 8:46 AM 

User01 получает сообщение.

Но я не могу заставить его отправить сообщение каждому пользователю в цикле foreach. Только User01.

ответ

0

Я думаю, что это то, как вы отправляете аргументы, которые не правы. Что вы должны делать: Скрипт $ должен быть всем скриптом, необходимым для отправки сообщения всем пользователям. В списке -argumentlist вы должны отправить переменную $ NotLoggedOut. Внутри части скрипта, которая будет отсутствовать как $ Args [0] .UserName (для первого пользователя и т. Д.).

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

$midnight = [DateTime]::Today 

$NotLoggedOut = @(@{UserName = "Jower";ComputerName = "JOWERWIN81";LogonTime= [DateTime]::Now.AddDays(-2)}, @{UserName = "Jower";ComputerName = "JOWERWIN81";LogonTime= [DateTime]::Now.AddDays(-1)}) | Where-Object {$_.LogonTime -lt $midnight} #Get-LoggedOnUser -ComputerName COMPUTERNAME | Where-Object {$_.LogonTime -lt $midnight} 

$Script={ 
    Foreach($User in $Args) 
    { 
     $mess = ("Dear " + $User.username + " the system shows that you have been logged on since " + $User.LogonTime + " REMINDER: You MUST Log off at the end of everyday") 
     write-host $mess 
     & {msg $args.Username /SERVER:($args.ComputerName) $args.Message} -ArgumentList @{UserName = $User.UserName;Message=$mess} 
    } 
} 

Invoke-Command -ScriptBlock $Script -ArgumentList $NotLoggedOut 
0

Я думаю, что с помощью Invoke-Command для простого пользователя Еогеаспа неясно и может быть трудно отлаживать. Почему вы не вызываете msg $user $message?

$NotLoggedOut = Get-LoggedOnUser -ComputerName COMPUTERNAME | Where-Object {$_.LogonTime -lt $yesterday} 
Foreach($User in $NotLoggedOut){ 
    $message="Dear $($User.username), the system shows that you have been logged on since $($User.LogonTime).`r`nREMINDER: You MUST Log off at the end of everyday." 
    msg $user.id $message 
} 

Я также использовал строки с улучшенным выражением для лучшего синтаксиса.