本文を読み飛ばす

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で動いた

コメント

Comments powered by Disqus
宣伝: