※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)