通过Powershell向远程PC发送消息

时间:2016-10-24 12:13:23

标签: powershell

脚本会关闭某些OU中的所有PC,如果它们在线超过2天。 我希望这个脚本在关闭PC之前向PC发送消息。

function Get-LastBootUpTime {            
param (
    $ComputerName
)
    $OperatingSystem = Get-WmiObject Win32_OperatingSystem -ComputerName $ComputerName               
    [Management.ManagementDateTimeConverter]::ToDateTime($OperatingSystem.LastBootUpTime)            
}

$Days = -0
$ShutdownDate = (Get-Date).adddays($days)

$ComputerList = Get-ADComputer -SearchBase 'OU=X,OU=X,DC=X,DC=X' ` -Filter '*' | Select -EXP Name
$A = Get-Date

Add-Content C:\Scripts\Shutdown\Report\shutdown.txt "`nDatum:" $A

$ComputerList | foreach {
    $Bootup = Get-LastBootUpTime -ComputerName $_

    Write-Output "$_ last booted: $Bootup" | tee -Append C:\Scripts\Shutdown\Report\shutdown.txt

    if ($ShutdownDate -gt $Bootup) {

        Write-Output "Rebooting Computer: $_" | tee -Append C:\Scripts\Shutdown\Report\shutdown.txt
    }
    else {
        Write-Output "No need to reboot: $_" | tee -Append C:\Scripts\Shutdown\Report\shutdown.txt
    }
}

但我无法弄明白......有人有想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Send-NetMessage脚本,或使用MSG命令

自行执行某些操作

答案 1 :(得分:0)

Msg.exe用于向终端服务器用户发送消息,并从终端服务器本身发送。

在无法发送邮件的计算机上修改其注册表。

使用regedit导航至:

 Name : AllowRemoteRPC
 Type : REG_DWORD
 Value : 1

更改以下值:

 $RegKey ="HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server"
 Get-ItemProperty -Path $RegKey -Name AllowRemoteRPC 
 Set-ItemProperty -Path $RegKey -Name AllowRemoteRPC -Value 1
 Get-ItemProperty -Path $RegKey -Name AllowRemoteRPC 

或使用以下powershell脚本

    $msgScript = {
        $Days = -2
        $ShutdownDate = (Get-Date).adddays($days)

        $ComputerList = Get-ADComputer -SearchBase 'OU=X,OU=X,DC=X,DC=X' ` -Filter '*' | Select -EXP Name
        $A = Get-Date

        $ComputerList | foreach {
            $Bootup = Get-LastBootUpTime -ComputerName $_    

            if ($ShutdownDate -gt $Bootup) {
               #send-msg
                Send-NetMessage "Shutdown start in 5 minutes.  Please log off." -Computername $_ -Seconds 0 -VerboseMsg -Wait

            }     
        }
    }

我建议提前发送邮件,例如5分钟即将关闭的用户。

发送消息的用户:

  #load the scripts, note the dot at start of line
  . .\Get-LastBootUpTime.ps1
  . .\Send-NetMessage.ps1

  $DELAYTIME=5 #minutes
  Invoke-Command -ScriptBlock $SendMessage
  # wait 5 minutes
  Set-WaitTime $DELAYTIME  #you can implement it

  Invoke-Command -ScriptBlock $ShutDown

您可以通过延迟自动执行发送消息和关闭任务的任务,例如:

 . the_path_to\Get-LastBootUpTime
 . the path_to\Send-NetMessage

<强>更新

为了避免错误消息说Get-LastBootUpTime和Send-NetMessage不是cmdlet,您需要加载这些函数。  要加载这些函数,请运行以下代码:

. .\Get-LastBootUpTime.ps1
. .\Send-NetMessage.ps1

如果这些脚本在当前文件夹中

{{1}}

注意行开头的点