3

以下のコードには、2 行の power-shell コマンドがあります。コマンド 1 はメールボックスを有効にし、コマンド 2 はアクティブ同期を無効にします。

PSCommand psCmd = new PSCommand();

command2 ="Enable-Mailbox -Identity \""+ ExchangeIdentity 
    +"\" -Database \""+ExchangeDBName+ "\" -DomainController \""
    +ExchangeDC+"\" -primarysmtpaddress \""+ExchangePrimarySMTPAddress +"\"";

command1 = "Set-CASMailbox -Identity \"" +ExchangePrimarySMTPAddress
    +"\" -ActiveSyncEnabled "+ActiveSync_Status;

allcommand = command2 + " |" + command1;

runspace.Open();

powershell.AddScript(allcommand);

powershell.Runspace = runspace;
ICollection<PSObject> iobj = powershell.Invoke();

add スクリプトでコマンド 1 を単独で実行しようとすると、メールボックスが正常に作成されます。2番目と組み合わせると、メールボックスだけが作成されますが、アクティブ同期は無効になりません(値をfalseとして渡す場合)。

1 行で 2 つのコマンドを処理するにはどうすればよいですか?

4

4 に答える 4

7

コマンドを呼び出すだけの場合は、AddScript を使用しないことをお勧めします。

両方のコマンドを呼び出したいが、最初のコマンドから 2 番目のコマンドに結果をパイプする必要はなく、PowerShell V3 を使用していると仮定すると、次のようなコードを記述します。

powershell.AddCommand("Enable-Mailbox")
    .AddParameter("Identity", ExchangeIdentity)
    .AddParameter("Database", ExchangeDBName)
    .AddParameter("DomainController", ExchangeDC)
    .AddParameter("PrimarySmtpAddress ", ExchangePrimarySMTPAddress );
// AddStatement - like adding a ';' in a script - V3 only
powershell.AddStatement();
powershell.AddCommand("Set-CASMailbox")
    .AddParameter("Identity", ExchangePrimarySMTPAddress)
    .AddParameter("ActiveSyncEnabled", ActiveSync_Status);

このように (AddScript を使用せずに) 記述すると、スクリプト インジェクションで発生する可能性のある問題を 1 つ回避できます。いずれかの引数が悪意のあるユーザーからのものである可能性がある場合、前の引用符の 1 つを閉じる引数を作成し、悪意のあるスクリプトを追加して、そのスクリプトを管理者権限で実行することができます。AddCommand/AddParameter を使用すると、この状況を回避できます。

引数を完全に制御したとしても、一部の引数に「;」などの文字が含まれていると問題が発生する可能性があります。引数を適切に引用していませんでした。

于 2013-09-24T22:00:55.950 に答える
1

AddScript(command2) と AddScript(command1) をパイプラインに追加してから Invoke するとうまくいきませんか?

これにより、powershellは両方のコマンドを順番に実行する必要があります...

于 2013-09-24T12:25:08.837 に答える