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

Send pop up message to specific RDP users who have not logged off

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

我正在我的 RDP 服务器上调用 "msg" 命令(网络发送),向任何一夜未登出的用户发送弹出消息。

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

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

我认为这是您发送参数的方式不正确。 你应该做的是: $script 应该是为所有用户发送消息所需的所有脚本。 -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

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

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