PowerShellで遠隔操作の準備

##注意
最近、Enable-PSRemotingではリモート操作が許可できなくなってしまった。
きっちりとは調査できていないが、winrm quickconfigを使うと遠隔操作ができるようになった。


```posh:管理者権限で実行
 # リモート操作許可
 winrm quickconfig -force
 
 # 接続先の登録
 Set-Item WSMan:\localhost\Client\TrustedHosts * -Force
 
 # スクリプト実行許可
 Set-ExecutionPolicy RemoteSigned -Force
```

詳しくは下記のサイトを読むと分かると思う。

[PowerShell 6 へリモート接続する(Windows 編)](http://www.vwnet.jp/windows/PowerShell/2018020501/ConnectRemotePS6.htm)
[ワークグループ環境の Windows Server 2016 への Enter-PSSession がエラーになる問題対応](http://www.vwnet.jp/Windows/WS16/2017062701/EnterPSSession4WGWS16.htm)


##過去の記事

僕はPowerShellをサーバー保守ではなくクライアントを操作をするために使っています。

Linuxはいいよね。
SSHで利用者が知らないうちにクライアントにログインして、
Programをkillして、
プリンタードライバーをインストールできる。

Windowsでもそんなことをやってみたいなぁ…。

##遠隔操作を許可する手順

どうもWindowsでもできるらしいという情報を得た。
Enable-PSRemotingというコマンドでできるらしい。
では順番に試していきましょう。

###ExecutionPolicy

PowerShellのスクリプトファイルを実行させるためにはExecutionPolicyをRemoteSignedにしないといけない。
先ずは、 **管理者権限** でPowerShellの画面を起動して下記コマンドを実行しよう。

```ps1:ExectionPolicyをRemoteSignedに
PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Pol
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y

```

WindowsServer2016あたりではRemoteSignedが標準だが、
Windows7やWindows10ではRestrictedが標準。
Restrictedはスクリプトの起動を許可してくれない。
今後バンバン、スクリプトを走らせたいので許可しておく。

よし、これでEnable-PSRemotingが実行できるかな。

###Enable-PSRemoting

Enable-PSRemotingというPowerShellのコマンドを使うとPowerShellで遠隔操作ができるらしい。

```ps1:Enable-PSRemoting
PS> Enable-PSRemoting
Enable-PSRemoting : アクセスが拒否されました。このコマンドレットを実行するには、[管理者として実行] オプションを使用して Windows PowerShell を起動してください。
```


##

おっと管理者権限が必要なようだ。

```ps1:管理者権限で実行
PS> Enable-PSRemoting -force
WinRM は要求を受信するように更新されました。
WinRM サービスの種類を正しく変更できました。 
WinRM サービスが開始されました。 

-Set-WSManQuickConfig : このコンピューターのネットワーク接続の種類の 1 つが Public に設定されているため、WinRM ファイアウォール例外は機能しません。
-ネットワーク接続の種類を Domain または Private に変更して、やり直してください。
```

あー、僕のVirtualBoxの「認識されないネットワーク」がPublicに設定されているわ。


```ps1:SkipNetworkProfileCheck
# 管理者権限で実行
PS > Enable-PSRemoting -SkipNetworkProfileCheck
WinRM は既にこのコンピューター上で要求を受信するように設定されています。
WinRM はリモート管理用に更新されました。
このコンピューター上のあらゆる IP への WS-Man 要求を受け付けるため、HTTP://* 上に WinRM リスナーを作成しました。 
WinRM ファイアウォールの例外を有効にしました。 
ローカル ユーザーにリモートで管理権限を付与するよう LocalAccountTokenFilterPolicy を構成しました。

```


これでログインできるかな。
Enter-PSSessionというコマンドでlocalhostでログインできるかやってみる。

```ps1:ローカルからログイン
PS> Enter-PSSession -ComputerName localhost -Credential Workgroup\Username
[localhost]: PS >

```

だが、別クライアントからログインができない。
そこで下記のコマンドを実行する。

```ps1:リモートホストを信頼
##リモートホストを信頼する
PS> Set-Item WSMan:\localhost\Client\TrustedHosts -Value *

```

通常はこれで遠隔操作可能なはずなのですが…。
パスワードを設定していないとログインできません。

Microsoft的にもセキュリティ的にもお勧めはできませんが、
パスワードなしでもログインできるようにする設定があります。

```ps1:パスワードなしのユーザーでもリモートログインできるように設定
##パスワードなしのユーザーでもリモートログインできるように設定
##管理者権限で実行すること
PS> Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa -name LimitBlankPasswordUse -Value 0

```

これで遠隔操作したい放題だ！！

```ps1:遠隔ログイン

PS > Enter-PSSession -ComputerName RemotePC -Credential Workgroup/UserName
# RemotePCに入った
[RemotePC] PS > 
# 重いProcessを探す
[RemotePC] PS > Get-Process | sort CPU -Descending | Select -First 3

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                                                           
-------  ------    -----      -----     ------     --  -- -----------                                                           
    421      48   184768     300076      46.42  12652   1 chrome                                                                
   1608      82    63200     105852      30.83   6228   1 explorer                                                              
   2008      98   125772     150072      19.61  10076   1 Dropbox

# 重いProcessをKill
[RemotePC] PS > Stop-Process -Name chrome

```

一つのクライアントに入って対話式でやるEnter-PSSessionを使ってもいい。
やっぱりInvoke-Commandで複数クライアントに一気にコマンドを送り込むのが素敵だよね。


##参考文献

[Enable-PSRemoting - MSDN](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/enable-psremoting)
[Enter-PSSession - MSDN](https://technet.microsoft.com/ja-jp/library/dd315384.aspx)

[PowerShellでリモート処理](http://d.hatena.ne.jp/unarist/20131020/1382287767)
Enable-PSRemotingに -SkipNetworkProfileCheckというオプションがあることを知った。
日本語のHelpには載ってなかったんだけどなぁ…。

[Windows XPスマートチューニング 173 パスワードを持っていないアカウントでリモートデスクトップ接続する](http://news.mynavi.jp/column/winxp/173/)
WindowsXP以外でも有効。
パスワードなしでリモートデクストップ接続できるということはPowerShellで遠隔ログインもできちゃいます。
セキュリティ的には危ないのでAt your own risk(自己責任)でお願いします。