我正在使用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。
答案 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}}
我还使用了表达式增强字符串来获得更好的语法。