2012-03-09 8 views
3

私はPerlスクリプトを持っているので、ローカルボックスで別のユーザーとして実行する必要があります。それは試験機なので、本当のセキュリティはありません—働いたらハンマーを使います。私がこれまで試したどのようなWindows上で別のユーザーとしてプロセスを起動する方法はありますか?

$cmd = 'runas /user:tester01 "perl delegated.pl"'; 
system($cmd) == 0 
    or die "could not spawn process as tester01: $!"; 

であるが、それは動作しません:それは対話的にパスワードの入力を要求します。 (echo passwordrunasへのパイプも失敗しました)

どのようにしてPerlスクリプト内から達成する必要がありますか?あるいは、私はその前に何か他のことをしなければならないのですか?system "runas..."

私はPsExecを使うことができますが、私はWindowsネイティブのソリューションを好むでしょう。現在動作するはずのボックスはWindows 7とWindows XPですが、後で他のWindows OSが追加される可能性があります。

+0

スクリプトが対話型プログラムで動作できるようにする 'Expect' perlモジュールを試すことができます。 –

答えて

3

WinAPIを使用して、スポーンされたシェルにパスワードを送信したくない場合は(たとえば、Win32::GuiTest SendKeysメソッドが役立つ場合があります)、PsExecを使用することをお勧めします。 )This threadは少し古くなっていますが、Microsoftのポリシーについてはまだ説明しています。ここで

+0

私はついに私の仕事をするためにPsExecを選びました。私は 'runas' + Win32 :: GuiTestを走らせることができましたが、残念ながら非常に信頼性の高い方法ではありません。 –

+0

(Windowsでのスクリプティングの古いルールも証明されています.Windowsのほとんどのネイティブな方法はネイティブな方法を避けています) –

0

私はあなたが$cmdその後systemは、1が渡されます、番号0と0==0に変換し、コマンドとしてそれを実行しようとしますので、$cmd==0は1と評価されますあなたのコードでは

system($cmd) == 0 
    or die "could not spawn process as tester01: $!"; 

をしたいと思います。

$cmdが暗黙的に数値に変換されたときに問題が報告されました。

+0

ありがとう、それは私の例では単にタイプミスでした。もちろん私は '警告を使う;' :) –

2

はあなたのコードが行くだろう方法は次のとおりです。

use strict; 
use warnings; 
use Win32::GuiTest qw[ SendKeys ]; 

system 1, q[runas /user:machinename\username "perl scriptname.pl"]; 

SendKeys('password~'); 

は)(のSendKeysについての詳細はWin32::GuiTestマニュアルを参照してください。

+0

Alois Mahdal-それは動作しますが、実行の入力が必要です。 –

+0

しかし、これはスクリプティングにはあまり適していません。つまり、(a)対話を避ける必要があります。(b)このスニペットがループに入れられている限り、非常に混乱するようです。おそらく 'Win32 :: GuiTest'でより多くの遊びが助けになるでしょう... –

+0

@AloisMahdal - ようこそ、ありがとう。入力を避ける方法をチェックします。 –

関連する問題