Windows Server 2008 以降のクラスターである WSFC (MSFC) では [Cluster Services] が [SYSTEM] (ローカル システム アカウント) アカウントで起動するようになっています。
そのため、クラスターの [汎用アプリケーション] も SYSTEM で実行されます。
汎用アプリケーションから共有フォルダにアクセスしたい場合や、特定のユーザーで実行させたい場合は少し実行方法を考える必要が出てきます。
今回はこのあたりを少し見ていきたいと思います。
■通常の汎用アプリケーションの実行アカウントを見てみる
コマンドから環境変数を取得する汎用アプリケーションになります。
環境変数の [USERNAME] には実行しているユーザーが格納されているはずですので、この値を確認してみます。
今回は [2008R2-SQL11-01] というサーバー上で実行しています。
この時の [USERNAME] は [2008R2-SQL11-01$] となっているのが確認できますね。
通常の汎用アプリケーションの場合、共有フォルダ等のネットワーク資源にアクセスをしたい場合は実行しているノードのコンピューターアカウントをセキュリティで許可することでネットワークへのアクセスが可能となります。
# クラスターの CNO (クラスター名オブジェクト) のアクセス権を設定してもアクセスはできませんでした。
■汎用アプリケーションで実行されるアプリケーションをローカル システム アカウント以外で実行
先ほどの内容では汎用アプリケーションをそのまま実行しているため、実行されているアプリケーションは [Cluster Services] を実行しているアカウントである [SYSTEM] で動作しています。
特定のユーザーを使用して汎用アプリケーションを実行したい場合の要件はこれでは満たせていないですね…。
[Cluster Services] をローカル システム アカウント以外で実行しようとすると以下のようなエラーとなり単純に変更することはできません。
# 私は途中で挫折しました…。
汎用アプリケーションを特定のユーザーアカウントで実行したい場合は、RunAs コマンドのようなユーザー名を指定して特定のコマンドを実行できるようなものを汎用アプリケーションとして登録し、そこからアプリケーションを実行することでユーザーを指定することが可能です。
ただし、RunAs はパスワードをオプションとして設定ができないため、VBScript で SendKeys を使用する必要が出てきます。
# WMI 等でもできそうな気がしますが。
[スクリプトは書きたくない!!] といった場合は Sysinternals の [PsExec] を使うと楽かと思います。
このツールは [PsTools] の中に含まれています。
このツールを使用して、アプリケーションを実行することで特定のユーザーを使用してアプリケーションを実行することが可能となります。
実際の設定がこちらになります。
# ?p の後はアカウントのパスワードを設定します。
PsExec を使用して、[c:battest.bat] を実行しています。
test.bat の中身はこのようになっています。
汎用アプリケーションとして実行したプロセスが終了してしまうとリソースが障害になってしまうので、プロセスが終了しないように PAUSE を指定しています。
SET > C:battest.txt |
この時ですが [-accepteula] を初回の起動時のために設定する必要があります。
Sysinternals のツールですが、初回の実行時にはライセンス許諾のダイアログが表示されます。
PsExec 自体は [SYSTEM] アカウントで実行しているため事前に PsExec を実行してライセンス許諾を許諾しておくことができません。
そのため、[-accepteula] を指定して、このダイアログで止まらないようにしています。
「USERDOMAIN] がコンピューター名で [USERNAME] が [Administrator] となっており、ローカルの Administrator として起動されたことが確認できますね。
# もちろんドメインユーザーで起動することも可能です。
タスクマネージャーからユーザー名を見てみたいと思います。
[PsExec.exe] は SYSTEM で起動されています。
ただし、そこから起動されたコマンドに関しては、[Administrator] で起動がされています。
最終的に実行したいアプリケーションが指定したユーザーで起動できていますね。
すこし手間かもしれませんがワンクッションはさむことで汎用アプリケーションから特定のユーザーでアプリケーションを実行するといったこともできそうですね。