どうもミツシマです。

今回は、特定のWindowsサービスをPowershellを用いてリモート起動・停止させる方法を検証しました。
今回起動させるサービス対象は「RemoteRegistry」です。
なぜ、このサービスかというとこのサービスを起動させた状態で、更にリモートでレジストリを参照したり修正したりすることが個人的に必要だったからです。
なので今からご紹介するスクリプトを修正してもらえれば、違うサービスも起動させることが可能です。


検証環境は以下の通り
ActiveDirectory環境
DC:WIndows Server 2016
PC:Windows10 1809


では、早速スクリプトのご紹介。
今回は複数端末のリモート起動を想定して、CSVファイルを1つ用意し、それを読み込んで順次処理していく形としました。
リモートで操作するのを円滑にするためにドメインのAdministratorでログインし実行することが前提となります。
※WORKGROUP環境やその他のユーザーで使用する場合には、別途アクセス権を考える必要があります。


PCList.csv
COMPUTERNAME
DESKTOP-JURRULG
TEST-PC
(続く)


StartRemoteRegistry.ps1
#CSVファイルを展開し、[RemoteRegistry]を実行させる端末を取得
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
$CSVPath = $CurrentFolder + "\PCList.csv"
$PCList = Import-Csv -Path $CSVPath -Encoding Default

#実行可否のPCリストを吐き出すテキストファイルを指定
$SuccessPCList = $CurrentFolder + "\StartSuccessPCList.txt"
$FalsePCList = $CurrentFolder + "\StartFalsePCList.txt"

foreach($PC in $PCList){
    
    $PCNAME = $PC.COMPUTERNAME
    $TESTConnection = Test-NetConnection -ComputerName $PCNAME -Port 445

    #必要なポート(445)が開いていた場合、サービスを「手動」に変更の上、サービス起動
    If($TESTConnection.TcpTestSucceeded -eq "True"){

        Write-Output $PCNAME'は接続可能です'

        Set-Service -Name remoteregistry -ComputerName $PCNAME -StartupType Manual
        Get-Service remoteregistry -ComputerName $PCNAME | Start-Service
        Write-Output $PCNAME >> $SuccessPCList
    }else{
        
        If($TESTConnection.PingSucceeded -eq "True"){

            Write-Output $PCNAME'はPing疎通可能ですが、ポート445が開いていません' >> $FalsePCList

        }else{
           
            Write-Output $PCNAME'はPing疎通できません。' >> $FalsePCList
           
        }

    }
    
}


<使用方法>
  1. 実行する端末にドメインのAdministratorでログインします。
  2. 上記2つのファイルを同じフォルダに配置します。
  3. 「PCList.csv」にリモートでサービスを起動させる端末のコンピュータ名を2行目以降に記載します。
  4. 「StartRemoteRegistry.ps1」をPowershellにて実行します。
  5. 同じフォルダに実行結果のテキストファイルが出力されます。サービス起動させた端末は「StartSuccessPCList.txt」、サービス起動出来なかった端末は「StartFalsePCList.txt」にそれぞれ出力されます。

それではスクリプトの具体的な処理の説明をしていきます。
まず、前提としてリモートでサービスを起動させるためには、TCPポート445が開いている必要があります。その為、このポートが開いているかどうかを確認し、開いていればサービスを起動させ、開いていない、もしくは、Ping応答がない場合はその結果を「StartFalsePCList.txt」に理由とともに出力させています。

ちなみにTCP445ポートはファイル共有で使用するポートでもあるので、「ファイルとプリンターの共有」が有効になっていれば、まず通るポートです。
今回リモート起動させる「RemoteRegistry」は常時起動させておくとセキュリティリスクとなるサービスなので、起動の種類が「無効」になっている環境もあると思います。
そのため、スクリプト上では一旦起動の種類を「手動」に変更の上、起動させています。
※「無効」のままだとサービスが起動出来ない為。


また今回の検証ではサービスのリモート停止を実施するスクリプトも作成しました。
上記でサービス起動に成功した端末に対して、サービスの再「無効」化と停止を実施するスクリプトです。


StopRemoteRegistry.ps1
#[StartSuccessPCList.txt]ファイルを展開し、[RemoteRegistry]を停止させる端末を取得
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
$TXTPath = $CurrentFolder + "\\StartSuccessPCList.txt"
$PCList = Get-Content -Path $TXTPath

#実行可否のPCリストを吐き出すテキストファイルを指定
$SuccessPCList = $CurrentFolder + "\StopSuccessPCList.txt"
$FalsePCList = $CurrentFolder + "\StopFalsePCList.txt"
foreach($PC in $PCList){
    
    $TESTConnection = Test-NetConnection -ComputerName $PC -Port 445

    #必要なポート(445)が開いていた場合、サービスを無効化し、停止する
    If($TESTConnection.TcpTestSucceeded -eq "True"){

        Write-Output $PC'は接続可能です'

        Set-Service -Name remoteregistry -ComputerName $PC -StartupType Disabled
        Get-Service remoteregistry -ComputerName $PC | Stop-Service -Force
        Write-Output $PC >> $SuccessPCList
    }else{
        
        Write-Output $PC'に接続出来ません。' >> $FalsePCList
    }
}


<使用方法>
  1. 実行する端末にドメインのAdministratorでログインします。
  2. 「StartSuccessPCList.txt」と同じフォルダにスクリプトを配置します。
  3. スクリプトをPowershellで実行します。
  4. 同じフォルダに実行結果のテキストファイルが出力されます。サービス停止させた端末は「StopSuccessPCList.txt」、サービス起動出来なかった端末は「StopFalsePCList.txt」にそれぞれ出力されます。




スクリプトの処理としては開始と逆のことをしているだけです。
検証環境ではバッチリ動きました!!
ただ、1点だけ難点を挙げるとすればポートが開いているかどうか確認するための「Test-NetConnection」の結果可否が思った以上に時間がかかること。。。
その為複数台実施出来ますが、実質は100台ぐらいまでに留めて置いた方がいいかな〜と思います。

スポンサードリンク