はじめに

Windows Serverを触る機会があった時に、Windows Serverから他のWindows Serverの
batファイルを実行する事がしたかったけど、環境的にできませんでした。(技術的には可能)

Windows Serverを滅多にさわらない自分には良い勉強だと思い
調べた事を備忘録的にまとめたいと思います。

環境
 Windows Server 2016 x 2台(ドメイン非参加)

検証項目
 1.タスクスケジューラを使用
 2.Powser Shellを使用
 3.WMICを使用

1.タスクスケジューラを使用

タスクスケジューラを管理するコマンドは「schtasks」です。
このコマンドプロンプトのオプションは

>schtasks /?

SCHTASKS /パラメーター [引数]

説明:
    管理者がローカルまたはリモートのシステム上のスケジュール タスクの作成、
    削除、クエリ実行、変更、実行および終了を行います。

パラメーターの一覧:
    /Create         スケジュール タスクを新しく作成します。
    /Delete         スケジュール タスクを削除します。
    /Query          スケジュール タスクをすべて表示します。
    /Change         スケジュール タスクのプロパティを変更します。
    /Run            スケジュールされているタスクをオン デマンドで実行します。
    /End            現在実行中のスケジュール タスクを停止します。

    /ShowSid        スケジュールされたタスクの名前に対応するセキュリティ ID を
                    表示します。

 

今回は、接続先サーバにて予め登録しているタスクを実行する事が目的です。
なので、オプションは、「/Run」を使用します。
 

>schtasks /Run /?

SCHTASKS /Run [/S システム [/U ユーザー名 [/P [パスワード]]]] [/I]
         /TN タスク名 [/HRESULT] [/?]
説明:
    スケジュールされているタスクをオン デマンドで実行します。

パラメーター一覧:
    /S     システム       接続先のリモート システムを指定します。
    /U     ユーザー名   schtasks.exe が実行されるユーザーコンテキストを指定します。
    /P     [パスワード]  指定されたユーザーのコンテキストのパスワードを指定します。省略すると入力が促されます。
    /I                         すべての制約を無視し、タスクをすぐに実行します。
    /TN    タスク名       実行するタスクのパス名を\指定します。
    /HRESULT            診断能力を向上させるために、プロセス終了コードはHRESULT 形式になります。


上記の/Runオプションを見て見ると「/S」オプションで対向サーバに接続できそうですね。
では、接続先(W2K16)にてテスト用のタスクスケジューラにタスクの追加を行います。

簡単なbatファイルを用意
 createZeroFile.bat
 内容:
  type nul > c:\temp\hogehoge.txt

格納先:
 c:\temp

上記のバッチファイルを作成し格納します。
また、タスク内容は以下の通りに登録しました。

接続先(タスクスケジューラ)
 スタート → Windows 管理ツール → タスクスケジューラ

基本タスクの作成
  名前:fileCreateZero
トリガー
  1回限り
   開始時間は、任意
操作
  プログラムの開始
   プログラム/スクリプト:C:\temp\createZeroFile.bat

これで、接続先サーバでの準備は完了。
今度は接続元でschtasksコマンドでリモートのタスクを実行していみます。
 

>schtasks /RUN /S 192.168.0.32 /U administrator /P [パスワード] /tn fileCreateZero
エラー: この要求はサポートされていません。


上記のエラー原因は、接続先のファイアウォールが原因でした。
DROPしたポート番号を調べ、許可ルールを設定したら実行できました。
そのポート番号が以下の通りです。
    ・49667/TCP
    ・137/TCP
    ・135/UDP

 

また、以下のコマンドで実行するとバッチファイルが実行されます。

>schtasks /RUN /S 192.168.0.32 /U administrator /P [パスワード] /tn fileCreateZero
成功: スケジュール タスク "fileCreateZero" の実行が試行されました。

 

 

2.Powser Shellを使用

まず、リモートのバッチファイルを実行するためには、
接続先にてWinRMが有効になっていなければなりません。

WinRMとは、Windows Remote Managementという名称で別のWindowsに対してリモート通信するためのプロトコルです。

なので、以下のコマンドを使用し状態を確認します。

Powershell起動
 スタート → Windows PowerShell → PowerShell

PS C:\Users\Administrator> Get-Service -Name WinRM

Status   Name               DisplayName
------   ----               -----------
Running  WinRM              Windows Remote Management (WS-Manag...


上記の結果通り「Running」となっているので既に実行済みとなっているようです。
ファイアウォールが有効になっていると当然パケットがDROPされますので
以下のPowerShellコマンドを使って許可ルールへ登録します。
 

>Get-NetFirewallRule -Name WINRM-HTTP*
Name                  : WINRM-HTTP-In-TCP
DisplayName           : Windows リモート管理 (HTTP 受信)
Description           : WS-Management による Windows リモート管理のための受信規則です。[TCP 5985]
DisplayGroup          : Windows リモート管理
Group                 : @FirewallAPI.dll,-30267
Enabled               : True
Profile               : Domain, Private
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local

Name                  : WINRM-HTTP-In-TCP-PUBLIC
DisplayName           : Windows リモート管理 (HTTP 受信)
Description           : WS-Management による Windows リモート管理のための受信規則です。[TCP 5985]
DisplayGroup          : Windows リモート管理
Group                 : @FirewallAPI.dll,-30267
Enabled               : True
Profile               : Public
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local

Name                  : WINRM-HTTP-Compat-In-TCP
DisplayName           : Windows リモート管理 - 互換モード (HTTP-In)
Description           : WS-Management 経由の Windows リモート管理用の互換モード受信規制です。[TCP 80]
DisplayGroup          : Windows リモート管理 (互換性)
Group                 : @FirewallAPI.dll,-30252
Enabled               : False
Profile               : Any
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local


上記通り、登録が完了しました。

念のため、ファイアウォールのルールに登録されているか確認したところ
以下の通りに登録されていました。

ルール名:
 Windows リモート管理 (HTTP 受信)
プロファイル
 すべて 
ポート番号
 80
 
ADに参加しているサーバであれば不要っぽいのですが
信頼できるホストの登録を接続元で実行します。

>Set-Item wsman:\localhost\Client\TrustedHosts "192.168.0.32" -Concatenate


確認コマンド:

>Get-Item wsman:\localhost\client\TrustedHosts

   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client

Type            Name                           SourceOfValue   Value
----            ----                           -------------   -----
System.String   TrustedHosts                                   192.168.0.32


コマンド実行

> Invoke-Command -ComputerName 192.168.0.32 -Credential administrator {c:\temp\createZeroFile.bat}
C:\Users\Administrator\Documents>type nul  1>c:\temp\hogehoge.txt

 

 

 

 

3.WMICを使用

コマンドプロンプトを開き以下のコマンドを実行する。

>wmic /node:192.168.0.32 /user:administrator /password:[パスワード] process call create "c:\temp\createZerofile.bat"

 

 

ここまで読んでくださって有難う御座います。

お疲れさまでした。