WSL: portproxy設定をタスクスケジューラで行う
WSLは各ユーザのプロファイルで起動しましたが、
portproxyの設定は管理者権限で動かさないといけません
(でした。よく知らないので...)
こんな感じのスクリプトを動かします。
function ipwsl() { return (Get-HnsEndpoint).IPAddress } $ip = ipwsl if ( $ip -eq "" ) { exit 1 } netsh interface portproxy reset netsh interface portproxy add v4tov4 listenport=22 connectaddress=$ip ` connectport=22 listenaddress=0.0.0.0 exit 0
これを C:\path\to\pp.ps1
として保存します。
管理者権限のpowershellから動かすとうまく動きます。
> powershell.exe -ExecutionPolicy ByPass C:\path\to\pp.ps1
準備OKです。
タスクスケジューラで管理者権限を使って
このスクリプトを動かすには以下をチェックします。
- Administratorsのユーザを指定
- 「ユーザーがログオンしているかどうかにかかわらず実行する」を指定
- 「最上位の特権で実行する」をon
これだけで行けるはず...(仕様とか知らないけど...)
そう思い、プログラムを指定します。
- powershell.exe
-ExecutionPolicy ByPass C:\path\to\pp.ps1
このように指定しても、うまく実行できません。
管理者権限で動いような...ただ実行結果が見えないんでよくわからないんですが...
何してもよくわからないんで、ネットを調べると
YAMK BLOG
というところで
一旦 batch をかませるとよい
という話が書いてあったのでやってみることに
powershell -Command "Start-Process powershell.exe -ArgumentList @(\"-ExecutionPolicy\", \"ByPass\", \"c:\\path\\to\\pp.ps1\")" -Verb runas -Wait -WindowStyle Hidden
※1行で書く
このスクリプトをタスクスケジューラに登録したら、
管理者権限でpowershellのスクリプトが動きました。
ハマったところ
正直、あんまりpowershell使いこなすつもりもないので
簡単に回避したいんですが、普段使ってないから調べるの大変でした...
-
管理者権限のユーザから、WSLのIPを取りたかったが、
WSLのユーザに管理者権限を付与しないと、うまく動かせなかった-
よく出てくるbashスクリプトでIPを取得する方法
$ip=bash.exe -c "ip --brief address show eth0 | xargs echo "
$ip=($ip -Split " ")[3]
$ip=$ip -replace "/[0-9]+",""
-
これはWSLユーザだといいけど、
管理者が違うユーザだと使えない... -
(Get-HnsEndpoint).IPAddress
で取れるらしいけど、
複数立ち上げてたらどうするのか知らない。
-
-
スクリプトが動いてるのかどうかログ出力を入れてみたが、
そもそもスクリプトを動かしてくれないので、
どこが悪いのかわからなかった...Set-PSDebug -Trace 1
Start-Transcript -path c:\app\wsl\test.log
-
タスクスケジューラのエラー番号見ても、さっぱりわからない...
「起動ディレクトリに"
を使ってはいけない」っていう話がよく見つかるが
それとは違った模様 -
powershellわからん
-ArgumentList
の次はリストを渡す...こんな感じ-ArgumentList @("a", "b", "c")
でも、すでにquote内にあるんですけど...各引数escape? -
batchファイルでpowershell呼び出したけど、escapeがどっちか分からなかった
- x
powershell -Command "Start-Process test
\"test\""
quote内はpowershellだからって、powershell風のescapeではない - o
powershell -Command "Start-Process test \"\""
batchファイルのescapeで動いた
- x
コメント
Comments powered by Disqus