新しくなったwinexe

# winexe とは
winexe とは、Linux から Windows 上のコマンドを実行することができるツールです。
もともとSamba 4.0のソースコードをベースに開発されたツールとして sourceforgeで提供されていましたが、近年はメンテナンスが行われなくなっていました。

しかし、最近、winexeのメンテナンスが再び行われ、Sambaの開発版のソースコードにマージされました。
そこで、今回は winexe について紹介します。

# winexe の仕組み
Windows Serverでは昔から psexec と呼ばれる仕組みが用意されていて、リモートからシステムにアクセスし、コマンドを実行するためのインターフェースとして利用できます。
psexecでは、WindowsサーバーのAdmin$ファイル共有にpsexesvcをコピーし、Windowsサーバー上でpsexesvcサービスとして実行することで、ローカルのコマンドとWindows上のコマンドを紐付け、リモートからのコマンド実行を可能とします。

winexeはこの仕組みを実現するために、通信部分に Sambaのライブラリなどを利用し、LinuxからWindows上のコマンド実行を可能にします。
仕組み上、Windows Serverの ファイル共有サービスが有効で、LinuxからWindows ServerのMicrosoft-DS（Microsoft Direct Hosting of SMB:445/TCP）ポートへのアクセスができる必要があります。

# winexeの準備
winexeは、2018/12/1現在、Sambaの開発版のソースコードのみにマージされています。
そのため、Gitを利用して、Sambaの開発版のソースコードを取得して、コンパイルする必要があります。

```
$ git clone https://git.samba.org/samba.git
```

ちなみに、ソースコードの取得にはかなり時間がかかります...
取得が完了したら、sambaのマスターブランチを使って、ソースコードのビルドを行ないます。

```
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  ...
```

Sambaのソースコードの examples/winexe配下にwinexeのソースコードが配置されています。

```
# yum install epel-release
# yum update -y
# yum install gcc \
  perl \
  mingw-binutils-generic \
  mingw-filesystem-base \
  mingw32-binutils \
  mingw32-cpp \
  mingw32-crt \
  mingw32-filesystem \
  mingw32-gcc \
  mingw32-headers \
  mingw64-binutils \
  mingw64-cpp \
  mingw64-crt \
  mingw64-filesystem \
  mingw64-gcc \
  mingw64-headers \
  libcom_err-devel \
  popt-devel \
  zlib-devel \
  zlib-static \
  glibc-devel \
  glibc-static \
  python-devel \
  gnutls-devel \
  libacl-devel \
  openldap-devel \
  jansson-devel \
  lmdb-devel \
  gpgme-devel \
  libarchive-devel \
  pam-devel
```

ソースコードの取得と、ビルドに必要なパッケージのインストールが完了したら、いよいよSambaのビルドです。

```
# cd samba
# ./configure
```

winexeのビルドに必要なパッケージがインストールされていれば、configureが完了した時点で bin/config.log ファイル中に以下の定義が行われているはずです。

```
#define HAVE_WINEXE_CC_WIN32 1
#define HAVE_WINEXE_CC_WIN64 1
```

Sambaのビルドを行ないます。

```
# make
```

makeにはしばらく時間がかかりますが...ビルドが完了すると、bin/winexeにwinexeコマンドが作成されます。

installコマンドでSambaのバイナリのインストールを行うと、/usr/local/samba配下にインストールされ、/usr/local/samba/bin/winexe としてwinexeの利用が可能になります。

```
# make install
```

# winexe の利用方法

winexe コマンドは、 対象のWindowsサーバーでWindows用のコマンドを実行することができます。

まずは簡単なところで Windows上でipconfigコマンドを実行してみます。

接続先、接続ユーザー、実行するコマンドを指定します。

```
# /usr/local/samba/bin/winexe -U Administrator //192.168.0.1 ipconfig
Enter password: ********  -Uオプションに指定したユーザーのパスワード
```

指定したユーザー・パスワードが正しければ、ipconfigコマンドの結果が表示されます。
ただし、メッセージのエンコーディングがシフトJISのためそのままでは文字化けしますので、iconvコマンドで変換して表示する必要があります。

```
# /usr/local/samba/bin/winexe -U Administrator //192.168.0.1 ipconfig | iconv -f cp932 -t utf-8
Enter password: *******

Windows IP 構成
イーサネット アダプター イーサネット:
....
```

バッチスクリプトや実行ファイルを実行する場合は、直接ファイルを指定します。

```
# /usr/local/samba/bin/winexe -U Administrator //192.168.0.1 "C:\scripts\test1.bat"
```

PowerShellスクリプトを実行する場合は、powershellコマンド経由で実行します。

```
# /usr/local/samba/bin/winexe -U Administrator //192.168.0.1 "powershell -Command C:\scripts\test1.ps"
```

winexeコマンド実行時、プロンプトから接続ユーザーのパスワード入力が求められますが、バッチ処理で利用したい場合はプロンプトからのパスワード入力を避けたい場合があります。

このような場合は認証情報として、次の内容のテキストファイルを用意し、-Aオプションにファイル名を指定することで、認証に利用することができます。 ファイル名は任意の名前で構いません。

winexe.pass

```
username=Administrator
password=pass123
```

```
# /usr/local/samba/bin/winexe -A winexe.pass //192.168.0.1 ipconfig
```

当然、このファイルにはWindows Serverの管理者アカウント情報などが含まれることになりますので、rootのみ参照可能など適切な権限で保護しましょう。


winexeコマンドを1度実行すると、Windowsサーバー上に winexesvcサービスが常駐しますが、--uninstallオプションを指定すると、コマンド終了時に winexesvcサービスも終了します。

```
# /usr/local/samba/bin/winexe -A winexe.pass --uninstall //192.168.0.1 ipconfig
```

# まとめ
winexeコマンドを利用すると、Linux上からWindows上のバッチを簡単に実行できるようになります。
特別なサービスの設定なども不要ですので、ちょっとした管理作業や、定期的なコマンド実行などをLinuxから行うことも簡単になりますので、LinuxとWindows Serverの混在環境で活用してみてはいかがでしょうか。