※2013-12-19更新
PsExec を使えばよいみたいです
http://technet.microsoft.com/ja-jp/sysinternals/bb897553.aspx
> コンピューター名を省略すると、PsExec では
> ローカル システムでアプリケーションを実行します。
ということなので、基本的な使い方は、以下の通りのようです。
psexec -u <ユーザー> -p <パスワード> <コマンド名> <引数>
[Powershellを使う方法]
標準ユーザーAが標準ユーザーBの権限でコマンドを実行したい時、
runas.exeを使えば良いが、savecredを使えない環境だと毎回パスワードの入力が必要。
以前は、runas.exeのパスワード入力を、Windows Script Hostで自動化していたが、
この方法でパスワード入力を実行している時、runas.exeが動いているウィンドウのフォーカスを
うっかり奪ってしまうと、うまくいかない。
そこで、Windows PowerShellを使ってみたところ、うまくいった。
検証環境は、Vista Home Premium 64bitで、具体的な方法は以下の通りです。
まず、次のバッチファイルを、メモ帳にコピペして、標準ユーザーAで作成した。
ただし、userb_idとuserb_pwの部分を、目的とする標準ユーザーBの実際の値に変更すること。
パスワードを平文で保存するのが不都合なら、この手は使えません。
== as_userb_run.bat ======================================================================
@echo off
REM ####################################################################
REM ##
REM ## 基本機能(用途)は、PowerShellを使って、
REM ## バッチファイルを別ユーザで実行すること。
REM ## ※エスケープや特殊文字の使用は非対応
REM ##
REM ## 例:
REM ## as_userb_run.bat "C:\Users\userb\opt\mybatch.bat"
REM ##
REM ####################################################################
set id='userb_id'
set pw='userb_pw'
REM ####################################################################
REM ## [For文メモ]
REM ## For文内での環境変数が扱いにくいので、あえてifとgotoで処理
REM ## [変数メモ]
REM ## %1: "ho ge" の時、 %~1: ho ge となり、引用符「"」があれば削除
REM ####################################################################
set arglist="'&'"
:arglist_append_start
if x%1 == x goto arglist_append_end
set arglist=%arglist%,"'''%~1'''"
shift
goto arglist_append_start
:arglist_append_end
REM ####################################################################
REM ## [powershellを2回使う理由]
REM ## 1回目: Start-Processの-Credentialで、ユーザをかえるため
REM ## 2回目: 実行演算子「&」を使い、通常の手順でコマンドを実行するため
REM ## [debugメモ]
REM ## powershellが-Commandの文字列を処理したあとも終了しないようにする
REM ## powershell -NoExit -Command ...
REM ##
REM ## powershell 1回目でエラーをあえて起させて、コマンドラインを見る
REM ## ... Start-Process powershell errarg -ArgumentList ...
REM ##
REM ## powershell 2回目でエラーをあえて起させて、コマンドラインを見る
REM ## ... @("'-Command'","'errarg'",%arglist%) ...
REM ####################################################################
REM ## 通常
powershell -Command Start-Process powershell -ArgumentList @("'-Command'",%arglist%) -LoadUserProfile -NoNewWindow -Credential (New-Object System.Management.Automation.PSCredential(%id%, (ConvertTo-SecureString -AsPlainText -Force %pw%))) -WorkingDirectory '%SystemRoot%'
REM ## powershell 1回目でエラー
REM #powershell -NoExit -Command Start-Process powershell errarg -ArgumentList @("'-Command'",%arglist%) -LoadUserProfile -NoNewWindow -Credential (New-Object System.Management.Automation.PSCredential(%id%, (ConvertTo-SecureString -AsPlainText -Force %pw%))) -WorkingDirectory '%SystemRoot%'
REM ## powershell 2回目でエラー
REM #powershell -Command Start-Process powershell -ArgumentList @("'-NoExit'","'-Command'","'errarg'",%arglist%) -LoadUserProfile -NoNewWindow -Credential (New-Object System.Management.Automation.PSCredential(%id%, (ConvertTo-SecureString -AsPlainText -Force %pw%))) -WorkingDirectory '%SystemRoot%'
exit /B
=======================================================================================
as_userb_run.batの使い方は、例えば、
c:\> as_userb_run.bat "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -no-remote
あるいは、
c:\> as_userb_run.bat notepad "C:\Users\userb\hoge hoge\fuga.txt"
あるいは、次のバッチファイル
as_userb_run.bat notepad "C:\Users\userb\hoge hoge\fuga.txt"
を作成し、実行する方法がある。
このようにすれば、 標準ユーザーAが標準ユーザーBの権限でコマンドを実行できるはず。
[参考]
「別のユーザーとして実行」して「管理者として実行」する。: Windows Script Programming
http://scripting.cocolog-nifty.com/blog/2010/01/post-a567.html
2012年10月6日土曜日
savecredを使えない環境でパスワード入力を自動化したrunasをpowershellで実現
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿