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の混在環境で活用してみてはいかがでしょうか。