2

2 つの主な処理を行う VBScript ファイル内から .​​NET (3.5) コマンド ライン プログラムを実行しようとしています。

  • スクリプトがホストされているサーバーと同じドメインにある Active Directory に接続して、属性値を取得します。ユーザー名である最初のコマンドライン引数を使用して AD を検索します。
  • 上記の属性値と 2 番目のコマンド ライン引数を使用して DTO を作成し、それを WCF サービス呼び出しで使用します。

アプリケーションを明示的に実行すると、すべてが機能します。Active Directory がアクセスされ、属性が取得され、WCF サービスが呼び出されて正しい結果が返されます (データベースを参照して確認)。

(編集:申し訳ありませんが、実際の問題が何であるかを忘れていました。)

スクリプトを実行すると、.NET コード (MyProgram アプリ) で Active Directory にアクセスできないように見えます。

VBScript コード:

Dim objResult

Set objShell = WScript.CreateObject("WScript.Shell")    
objResult = objShell.Run("MyProgram " & strUsername & " 0", 1, True) 

WScript.Shell オブジェクトには、ファイルに対する特別なアクセス許可が必要ですか? それらを確認しましたが、実行権限があります。通常、.Run() メソッドに渡す 2 番目の引数は 6 ですが、デバッグ用に 1 にしたかったのです。

VBScript でプログラムを実行する別の方法はありますか?

4

4 に答える 4

1

これは返信ではありません (コメントは投稿できません)。残念ながら、私は citrix を扱ったことがなく、通常の Windows サーバーのみを扱いました。

_0. Windows ファイアウォールや、プロセスを選択的にブロックするその他のパーソナル ファイアウォールの犠牲になっていないことを確認してください。

.NET アプリの最初の行に 10 分の Sleep() を追加してから、VBScript ファイルとスタンドアロン アプリケーションの両方を実行し、sysinternals プロセス エクスプローラーを実行して、2 つのプロセスを比較します。

_1. 同じタブ、「コマンドライン」と「現在のディレクトリ」。それらが同じであることを確認してください。

_2. 「環境」タブ。それらが同じであることを確認してください。通常、子プロセスは環境を継承しますが、この動作は簡単に変更できます。

「スクリプトを実行する」が他の意味である場合は、.VBS ファイルをダブルクリックして、次のチェックが必要です。

_3. 画像タブ、「ユーザー」。それらが異なる場合 - ユーザーがネットワーク (localsystem など) にアクセスできないか、ユーザー トークンが委任に制限されているためにローカル リソースにしかアクセスできない (IIS NTLM 認証の場合など)、またはユーザーが一部のリソースにアクセスできないことを意味する可能性があります。必要なローカルファイル。

于 2009-06-28T11:58:06.473 に答える
1

問題は証明書に関連していることが判明しました。コンソール アプリによって呼び出される WCF サービスは、認証に X509 証明書を使用します。この証明書は、このスクリプトがホストされ、実行されるサーバーにインストールされます。

同じサービスが使用される他のサーバーでは、証明書は次のように構成されています。

winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "certificate-name" -a "NETWORK SERVICE"

IIS のコンテキスト内で実行されたため。ただし、スクリプトが本番環境と同じように実行されていた場合、それはユーザー自身のコンテキストの下にあります。そのため、スクリプトを次のように変更する必要がありました。

winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "certificate-name" -a "USERS"

その変更が行われると、すべてがうまくいきました。支援を提供してくれたすべての人に感謝します。

于 2009-08-18T18:42:17.227 に答える
0

Shiraz のアイデアを採用し、それを実行します...

アプリケーションで、AD にアクセスするためのドメイン ユーザー アカウントとパスワードを明示的に定義していますか?

アプリケーションを明示的に実行している場合、本質的に資格情報 (現在ログインしているドメイン アカウント) を使用して AD に問い合わせている可能性があります。ただし、スクリプトからアプリケーションを呼び出す場合、アプリケーションがシステム コンテキストにあるかどうかはわかりません。

VBScript の例は次のようになります。

  Dim objConnection As ADODB.Connection
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Properties("User ID") = "MyDomain\MyAccount"
    objConnection.Properties("Password") = "MyPassword"
    objConnection.Open "Active Directory Provider"

これが機能する場合は、もちろん、このタスク専用のサービス アカウントを作成して使用し、そのアカウントへの対話型ログインを拒否するのがベスト プラクティスです。

于 2009-06-26T23:20:17.317 に答える