7

データベースのインポート プロセスを 1 時間ごとに実行する Windows のスケジュールされたタスクがありますが、ユーザーが ASP.net ダッシュボード (Windows Server の IIS6 で実行) のボタンを押すことでスケジュール外に開始できるようにしたいと考えています。 2003)。

以下はコードビハインドで完全に機能します...

var proc = new Process
            {
                StartInfo =
                    {
                        UseShellExecute = false,
                        FileName = @"C:\Windows\System32\schtasks.exe",
                        Arguments = "/run /tn Loader",
                        RedirectStandardError = true,
                        RedirectStandardOutput = true,
                        CreateNoWindow = true
                    }
            };
proc.Start();
proc.WaitForExit();

...ただし、アプリケーション プール ID が Local System に設定されている場合のみ (理想的ではありません!)。Network Service のままにしておくと、タスクが開始されません。したがって、おそらく権限の問題です。

アプリケーションをローカル システムとして実行せずに、ASP.net がサーバー上でスケジュールされたタスクを開始できる方法はありますか? そうでない場合、どのような良い代替手段がありますか?

更新: SOの誰も知らない場合、それは不可能だと思うので、Webアプリケーションにリクエストをデータベーステーブルに書き込み(監査ログを兼ねて)、そのテーブルをポーリングしてキックする2番目のタスクを作成するという私の考えに従いますメインタスクから離れます。

4

4 に答える 4

5

スケジュール タスクを更新して、特定のイベントをトリガーします。次に、ボタンがクリックされたときに Web サイトにそのイベントをログに記録させ、スケジュールされたタスクを開始します。

例: ソースの作成には管理者権限が必要なので、インストーラーでプログラムのイベント ログ ソースを作成します (コマンド ラインを使用してソースを作成することもできます) 。

  if (EventLog.SourceExists("MyApp"))
  {
      EventLog.CreateEventSource("MyApp", "Application");
  }

次に、アプリケーションで、ボタンがクリックされたときにイベント ログ エントリを作成します。

private void btnOpenOtherApp_Click (object sender, EventArgs e) 
{
    try 
    {
        var log = new EventLog
        {
            Source = "MyApp"
        };
        log.WriteEntry("Start MyOtherApp", EventLogEntryType.Information, 1337);
    } 
    catch (Exception ex) 
    {
        ...   
    }
}

また、タスク スケジューラは、イベントがログに記録されたときに MyOtherApp を開くように設定されています。 イベントビューア

于 2013-11-06T16:16:23.417 に答える
1

Windows では管理者ユーザーが必要です。このコードは、タスクを呼び出すのに役立ちます。

var securePass = new System.Security.SecureString();
foreach (char c in "my_password")
{
    pass.AppendChar(c);
}

var proc = new Process
{
    StartInfo =
    {
        UseShellExecute = false,
        FileName = @"C:\Windows\System32\schtasks.exe",
        Arguments = "/run /tn Loader",
        UserName = "myAdminUser", //NEW
        Password = securePass, //NEW
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};
proc.Start();
proc.WaitForExit();

アプリケーションを SYSTEM アカウントとして実行する必要がある場合は、次の引数を使用できます。

/RU ユーザー名と /RP パスワード パラメーターが現在ログインしているユーザーと一致する場合、タスクは対話的に実行されます (フォアグラウンドで表示されます)。

システム アカウントの場合、/RU ユーザー名は ""、"NT AUTHORITY\SYSTEM"、または "SYSTEM" のように記述できます。パスワードは必要ありません。システム アカウントには、ローカル マシンへのフル アクセス権がありますが、ネットワーク上の他のマシン (またはマップされたドライブ) に対する権限はありません。

ソース: http://ss64.com/nt/schtasks.html

于 2013-08-27T11:01:22.933 に答える
0

Quartz.NETなどのサード パーティのスケジューラ サービスを使用することがオプションではなく、権限の変更も許可されていない場合 (いずれにしても良い考えではありません)、ASP.NET 間のブリッジとしてヘルパー Windows サービスを作成することもできます。アプリケーションと Windows スケジューラ。タスクのリストを DB に保存すると、一連のイベントは次のようになります。

  1. タスクを実行する必要がある場合、ASP.NET GUI からそのタスクの DB にフラグを設定します
  2. ヘルパー サービスはスケジュールに従って実行され、指定された間隔で DB をチェックします。フラグを確認し、タスクを開始し、フラグをリセットします。

ああ、Windows タスク スケジューラをラップするライブラリ ( http://taskscheduler.codeplex.com/など) があるので、それらを直接実行する必要はなく、適切に管理された方法で実行できます。

于 2013-11-06T16:29:25.903 に答える
0

ASP.NET のキャッシュを利用してスケジュール タスクを実行できます。私は個人的にこれを使用しましたが、魅力的に機能しました。もちろん、いくつかの制限(精度)がありますが、調整/変更できます。

https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

よろしく

于 2013-08-27T11:16:03.817 に答える