準備
- dropboxと組み合わせて、リモートPCを管理したければ、dropboxに専用フォルダを作成して、その直下に以下のScriptを
heartbeat.ps1
というファイル名で作成する
- 自宅PCの場合でも、スマホからも管理したければ、やはりdropboxと組み合わせて運用することを勧める
- 拡張子ps1の実行には、設定変更が必要(後述)
heartbeat.ps1
ファイルを作成したフォルダに、必ず空の(0バイトの) reboot.lock
を作成しておく。そうしておかないと、上記スクリプト起動時にPCが強制再起動される
powershell(PS) Script例
$rbLock = "reboot.lock"
If(!(test-path $rbLock)){
New-Item -ItemType File -Force -Path $rbLock
Restart-Computer -Force
Exit
}
Set-Variable -Name 'SchedTaskHist' -Value "history\dd9999_scheduled_task_history.txt"
Set-Variable -Name 'SshProcessName' -Value ssh
Function getHourMin([int]$h,[int]$m){
$strM = [string]
$strH = [string]
if ($m -lt 10){
$strM = "0" + [string]$m
}else{
$strM = [string]$m
}
if ($h -lt 10){
$strH = "0" + [string]$h
}else{
$strH = [string]$h
}
return $strH + $strM
}
$cronHHLock = "cronHH.lock"
If(!(test-path $cronHHLock)){
Get-Item * -include hh*.ps1 | ForEach-Object {
$min01 = $_.Name.substring(2,2)
$min02 = (get-date).Minute
if($min02 -eq $_.Name.substring(2,2)){
echo (Get-Date -Format G) $_.Name | Out-File $SchedTaskHist -append
Invoke-Expression $_
}
}
}
$cronDDLock = "cronDD.lock"
If(!(test-path $cronDDLock)){
Get-Item * -include dd*.ps1 | ForEach-Object {
$hour02 = getHourMin (get-date).Hour (get-date).Minute
if($hour02.substring(0,4) -eq $_.Name.substring(2,4)){
echo (Get-Date -Format G) $_.Name | Out-File $SchedTaskHist -append
Invoke-Expression $_
}
}
}
$lock = "hbJob.lock"
If(!(test-path $lock)){
echo "リモート接続用プロセスを起動する" | Out-File -FilePath $SchedTaskHist -Append
Start-Process -filepath hbJob.bat -WindowStyle hidden
New-Item -ItemType File -Force -Path $lock
}
Script構成例
C:\dropbox\PC_Aフォルダ
heartbeat.ps1
hbJob.ps1
hbJob.lock
reboot.lock
hh25_check_service.ps1
hh99_checkdrive.ps1
dd0440_check_service.ps1
hh99_check_service.ps1
KickPS.js※参考を参照
- Windowsタスクスケジューラからの起動は、
"C:\Dropbox\PC_A\KickPS.js" "C:\Dropbox\PC_A\heartbeat.ps1"
となる
KickPS.jsコード例
Windowsタスクスケジューラに「heartbeat.ps1」を登録する際、「KickPS.js」経由で起動するようにしている。理由は、「heartbeat.ps1」を直接起動すると、powershellの起動画面が一瞬表示されてしまい作業の邪魔になるから。
wsShell = WScript.createObject("WScript.Shell");
retCode = wsShell.Run("powershell.exe -File " + WScript.Arguments.Item(0),0,true);
WScript.Quit(retCode);
以下のサイトにある内容を参考にしている。
「windows」で「PowerShell」を「一切画面表示せず」に「タスクスケジューラに登録」する方法を再確認
https://qiita.com/Fushihara/items/1576f08825f39706174f
実行ポリシーの変更
デフォルトでは、拡張子ps1を持ったファイルをダブルクリックするなどしても、実行できない。実行ポリシーの変更が必要。例えば下記のようにする。
# 事前にコマンドプロンプトを管理者で起動して以下を実行
C:\Windows\system32> powershell
PS C:\windows\system32> Get-ExecutionPolicy
Restricted
PS C:\windows\system32> Set-ExecutionPolicy RemoteSigned
PS C:\windows\system32> Get-ExecutionPolicy
RemoteSigned
以下のサイトにある内容を参考にしている。
powershell チートシート
https://qiita.com/jca02266/items/a0c71ae90d055ab3893c
関連する記事・ページ
自宅PCをスマホでリモート管理(タスク管理編)
PCをリモート管理する1手法
【コードサンプル】Windowsタスクへの登録例
【コードサンプル】heartbeat.ps1 – 心音確認 PowerShell Script
【コードサンプル】1時間タスクのScript例
【コードサンプル】24時間タスクのScript例
【コードサンプル】hbJob.bat – Windows Bat Script
【コードサンプル】プロセスモニタのScript例
【コードサンプル】IFTTT経由でLINE通知するScript例
【コードサンプル】ネット転送量モニタ