2016-09-29 11 views
0

私は完璧に動作するWindowsサービスを作成しました。電話番号はであり、{argument}install,uninstall,startおよびstopのような重要な仕事です(コマンドプロンプトで)。サービス思考を開始するASP.net Page

このサービスが必要なプログラムは、管理者特権を必要とします(それ自体がインストール/アンインストールされるため)。例えば、cmdを管理者として"D:\folder\chatserver.exe install"とすると、それは必要なサービスがインストールされます。

私のASP.netサイトでは、プロセスを開始するための関数を書きましたが、例外が発生しました。"740" ("the software required privilege elevation")私の関数の "AsAdmin"引数に "true" 、私はそれが"UseShellExecute"を例外として真実にすることはできません。

public static int RunProcess(string ApplicationPath, string Parameters = "", bool AsAdmin = false) 
{ 
    try 
    { 
     global::System.Diagnostics.ProcessStartInfo startInfo = new global::System.Diagnostics.ProcessStartInfo(); 
     startInfo.UseShellExecute = AsAdmin; 
     if (AsAdmin) { startInfo.Verb = "runas"; } 
     startInfo.WorkingDirectory = global::System.IO.Path.GetDirectoryName(ApplicationPath); 
     startInfo.FileName = ApplicationPath; 
     if (!string.IsNullOrEmpty(Parameters)) { startInfo.Arguments = Parameters; } 
     startInfo.ErrorDialog = false; 
     global::System.Diagnostics.Process process = global::System.Diagnostics.Process.Start(startInfo); 
     process.WaitForExit(); 
     return process.ExitCode; 
    } 
    catch (global::System.ComponentModel.Win32Exception ex) { return ex.NativeErrorCode; } 
    catch { return -1; } 
} 

私は何をしますか?

答えて

1

ProcessStartInfoを試しましたか?具体的にはcredentialsを追加することができます。以下の例を確認してください:

ProcessStartInfo myProcess = new ProcessStartInfo(path); 
myProcess.UserName = username; 
myProcess.Password = MakeSecureString(password); 
myProcess.WorkingDirectory = @"C:\Windows\System32"; 
myProcess.UseShellExecute = false; 
// elevate EDIT 
myProcess.Verb = "runas"; 
Process.Start(myProcess); 


private static SecureString MakeSecureString(string text) 
{ 
    SecureString secure = new SecureString(); 
    foreach (char c in text) 
    { 
     secure.AppendChar(c); 
    } 
    return secure; 
} 
さらにテッドの答えに

Launch a process under another user's credentials

+0

thansk ted!私が知っている信じられないこと、しかし忘れた場合!どうすればいい? – SammuelMiranda

+0

が試してみましたが、それは意味がありましたが、まだ "Win32Exception"、 "要求された操作は仰角が必要です" – SammuelMiranda

+0

@SammuelMiranda - 私の編集 'myProcess.Verb =" runas "を参照してください; – Ted

0

、私はこれを追加します。

Microsoftはw3wp.exeのは、実行時にWebアプリケーション/サイトから.exeファイルを呼び出すことはお勧めしません。セキュリティ上の理由からサンドボックス環境で実行されるため、起動するスレッド/タスク/プロセスは、自分で起動したときと同じではないため、期待どおりに動作しない可能性があります。

コンソールアプリケーションを、IISまたはWindowsサービスでホストされるASP.NET Web APIとして再コーディングすることができます。

+0

アイルランド、答えはありがたいですが、ちょうど明確にするために、それはWINDOWS SERVICEです、穴のポイントは私のASP.netページを作ることですそのサービスの開始/停止を呼び出すことができます – SammuelMiranda

+0

私はこの非常に問題のMSサポートエンジニアによって一度教育を受けました。要するに、WebアプリケーションからWindowsサービスを呼び出すべきではないということです。これは実行できますが、Microsoftによってサポートされているわけではありません。 – IrishChieftain

1

これを行うことはできません。そうしたくはありません。 Webアプリケーションの近くに管理者の資格情報を保存する必要はなく、は管理者権限でWebアプリケーションをに実行したくないのは間違いありません。

ローカルホスト上のWCFなどのコマンドを受け入れるService Control Manager(SCM)とやり取りするための適切な権限を持つ「ウォッチドッグ」Windowsサービスを実際に使用し、そのサービスは適切なサービスを開始または停止します。このようになります

[Web Application] -- WCF --> [Watchdog Service] -- SCM --> [Chat Service] 

だからあなたのWebアプリケーションは、WCF経由StartService("ChatService")コマンドを送信し、ウォッチドッグ・サービスはChatServiceサービスを開始します。

ウォッチドッグサービスだけが管理者特権で実行され、認証されたアプリケーションだけが呼び出すようにWCF通信を保護する必要があります。これについては他の質問で説明します。

ウェブサイトやサービスを含む自己インストールWebプラットフォームを開発しようとしている場合は、手動で行う代わりに、適切なインストーラを使用することを検討してください。

関連する問題