ヘルプが必要なアクションは、IIS が同じサーバー インストール上にあるイントラネット Web ページから、独自のサーバー ディスクで EXE ファイルを実行することです。Web ページは、ビジネス レイヤーを使用して、指定されたパラメーターと共に ProcessStart を実行します。
Web から実行すると、タスク マネージャーは、アプリケーションが Web ページの IIS AppPool をユーザーとして起動していることを示します。数秒後、殺されます。私のデータベース ログでは、次のことを確認できます。
The Microsoft Jet database engine cannot open the file '\\computer\pathfile.ext'. It is already opened exclusively by another user, or you need permission to view its data.
そのとおりです。EXE ツールは、他のコンピューターからファイルをロードしています。これは、デスクトップからツールを使用しているときによく研究され、うまく機能する特別な動作です。
私の目標/質問、
私はこの web-function-call がデスクトップ権限で動作することを望みます。それはまったく可能ですか?
IIS AppPool には、アカウント ApplicationPoolIdentity を使用した通常のセットアップがあります。IIS 7.5 と Windows Server 2008 R2 が <= IIS6 からセキュリティ モデルをどれだけ引き上げたかについての知識がなかったので、私は「幸運で賢明ではない」ように見えました。
app-pool ユーザーを NetworkService、管理者に変更しようとしました。
app-pool を使用してアプリケーションを exec/read 権限として設定しようとしまし
たが、内部でアプリケーションを呼び出して webapp にバッチファイルを実行させようとしました..
次に、ProcessStart の動作を変更し始めました。そして、ここで、私は何をすべきかをあまり知りません。VERB ルナを追加してみました。ここでは、パスワードプロンプトを強制することは解決策ではありません。ユーザー名/パスワードをシミュレートしようとしました。そこには運がありません。また、デスクトップ コマンド ウィンドウで一度 /savecred を使用した後、runas /user: blabla を ProcessStart のパラメーターとして追加しようとしました。そこには運がありません。
たぶんこれでうまくいくはずですが、プロパティの正しい設定がわかりません。以下に ProcessStart コード スニペットを追加し、コメント付きのコードをいくつか追加して、私が試したことを確認できるようにします。
public string RunProcess(ApplicationType type, int param)
{
currentSelection = GetApplicationType(type);
ProcessStartInfo info = new ProcessStartInfo(currentSelection.Path);
info.CreateNoWindow = false;
info.UseShellExecute = true;
//info.UseShellExecute = false;
//info.ErrorDialog = false;
//info.UserName = "dummyUsEr";
//info.Password = this.SecurePwd("DummyPWd");
info.WindowStyle = ProcessWindowStyle.Normal;
info.Arguments = string.Format(" {0}", param.ToString());
using (Process exec = Process.Start(info))
{
try
{
exec.WaitForExit();
}
catch
{
}
}
return output;
}
編集
明確にするために、おそらくこの質問を参照している別の男/女を助けるために、パスワード生成のスニペットを添付します。
protected System.Security.SecureString SecurePwd(string pwd)
{
SecureString securePwd = new SecureString();
foreach (char ch in pwd.ToCharArray())
securePwd.AppendChar(ch);
return securePwd;
}