向尚未注销的特定 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
}
我还使用了表达式增强的字符串以获得更好的语法。
我正在使用 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
}
我还使用了表达式增强的字符串以获得更好的语法。