将弹出消息发送给尚未注销的特定RDP用户

时间:2015-08-03 05:51:16

标签: powershell foreach remote-desktop invoke-command msg

我正在使用Microsoft Technet脚本中心存储库中的Get-LoggedOnUser函数:Get-LoggedOnUser

我正在调用我的RDP服务器上的“msg”命令(net send),向任何未在一夜之间注销的用户发送弹出消息。

我不想将消息广播给服务器上的所有用户;只需向前一天午夜之前登录的任何个人用户发送通知 我希望该消息显示其用户名和登录时间,并提醒他们注销。

$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。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为对于简单的foreach用户使用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 }

{{1}}

我还使用了表达式增强字符串来获得更好的语法。