- - PR -
【C#】C#アプリからによるタスク登録の自動化について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-21 13:08
いつもお世話になっております。
タスクのスケジュール登録をC#から行うことができるかについて教えて下さい。 タスクの登録は、一般に下記があると思います。 @ATコマンドからコマンドラインで登録 ※ただし実行ユーザ/パスワードは、 『コンパネ⇒タスク⇒ATサービスのアカウント』より、あらかじめ登録が必要 デフォルトではSystemアカウントで実行される。 (変更するとOS再起動必要かも!?) Aコンパネ⇒タスクよりユーザ操作で登録 ※当然ユーザ操作で、実行ユーザ/パスワードは入力が必要 これらと同様の操作をC#プログラムから実行するAPIなどあるのでしょうか? (個人的には、セキュリティ上公開してないんでは?と思っていますが...) ●C#アプリから行いたい処理 ・『現在ログオンしているユーザ』のスケジュールをC#アプリから登録したい。 ・ユーザ操作(例えば『コンパネ⇒タスクのユーザ操作』)はさせずに登録する ※実行ユーザのドメイン名/アカウント/パスワード入力をせずに タスクスケジュール登録する。 ・『Systemアカウント』からの実行は不可とする。 ※(今回実施したい処理の都合上、)現在のログオンユーザのアカウント 名称を意識する必要があるためSystemアカウントでは不可。 また、できたとしてWin2000とWinXPの差分をアプリで意識する 必要があったりするんでしょうか? ご意見などありましたら、情報よろしくお願いいたします。 以上、お忙しいとは思いますが、よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2005-12-21 13:28
API は公開されていますが、.NET の標準クラスライブラリにはそれを扱うためのクラスが用意されていません。 タスクスケジューラ関係の API は COM 形式で公開されているので、.NET の COM 連携機能を介して操作するか、あるいは WMI でもタスクスケジューラの操作ができたような気がします。
他人が設定したタスクの閲覧や編集ができない、とか、そういう制御がきちんとされていれば、特にセキュリティ上の問題は無いはずです。 そういう視点では、「タスクを操作する」のも「ファイルを操作する」のも本質的には同じようなもんじゃないでしょうか。 具体的に、どういう点が心配ですか?
「タスクを操作する」部分に関しては、特に意識することは無いと思います。 | ||||||||||||||||
|
投稿日時: 2005-12-21 17:12
早速の回答ありがとうございます。
>他人が設定したタスクの閲覧や編集ができない、とか、 >そういう制御がきちんとされていれば、 >特にセキュリティ上の問題は無いはずです。 >そういう視点では、「タスクを操作する」のも「ファイルを操作する」 >のも本質的には同じようなもんじゃないでしょうか。 言われてみれば、そうですね。 >具体的に、どういう点が心配ですか? 『なんとなくセキュリティ上厳しいのかな』的な思いつきで書いたので 特に深い意味があっての発言でははありません。 ただ、『悪意のあるアプリ』がスケジュール操作して OSをメチャメチャにするタスクを登録すると困るからAPIを公開していないかなという直感でした。 >タスクスケジューラ関係の API は COM 形式で公開されているので、 >.NET の COM 連携機能を介して操作するか、あるいは WMI でも >タスクスケジューラの操作ができたような気がします。 『.NET の COM 連携機能』、『今回使用するWMI』って、 ディープな感じがしますので英語資料な気がしますが... どのあたりに資料があるんでしょうか? (探してみましたが、それらしい資料を見つけられませんでした。) そもそもWMIや、指定するクエリ(SQL分のような表記のもの)、スキーマ名に関しても よく理解できていませんので、いい機会ですので勉強してみたいと思います。 参考サイトなどあれば教えていただけないでしょうか? そういえば、WMIってadmin権限無しでも関数使えるんでしょうか? また、タスクでスケジュール化したプロセスに、 コマンドライン引数を指定しておくことってできるんでしょうか? COMの名前やWMIの検索ワードなど教えていただけると、ありがたいです。 以上、お忙しいとは思いますが、よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2005-12-21 18:19
こんばんは。
私は実際に使用したことないので、間違っているかもしれませんが、おそらく COMを使うのであれば ITaskScheduler WMIを使うのであれば Win32_ScheduledJob だと思います。 | ||||||||||||||||
|
投稿日時: 2005-12-21 18:28
WMI Win32_ScheduledJob Class は
Task Scheduler Service ではなく、AT Command 互換のものです。 ご注意を・・・ あとは、XP Professinal 移行なら SCHTASKS という Command もありますね。 | ||||||||||||||||
|
投稿日時: 2005-12-22 11:00
アドバイスありがとうございました。
なけなしの英語力でがんばって読んでみました。 @『ITaskScheduler』案に関して どうもヘッダやLibが必要なようなのでC#からでは 使用できない?のかなというのが印象です。(C++用でしょうか?) (C#プロジェクトの『参照追加』⇒『COM』タブ一覧に 『Mstask.dll』が現れませんでしたし、 直接『C:\Windows\System32\mstask.dll』 を追加しようとしてもVSからエラーがでました。) 結論としては、難しそうです。 (C++で、ITaskSchedulerをラップしたDLLを作って、 C#アプリから呼ぶことも可能かもしれませんが、 なかなか道は険しそうです...) A『Win32_ScheduledJob 』案に関して ATコマンド互換(⇒実行ユーザ設定が必要)ということ?かな と思いますので、無理そうです。 参考までに、下記のようなコードを書いたのですが、 WQLで取得したデータセットが0件のようです。 なぜ取得できないのか不明です...何か間違えていますか? (タスクは、いくつか登録してあります。) ●サンプルコード //登録されているスケジュール一覧を取得する ManagementScope scope = new ManagementScope (@"\\.\ROOT\CIMV2"); scope.Connect(); ObjectQuery query = new ObjectQuery (@"SELECT * FROM Win32_ScheduledJob"); ManagementObjectSearcher searcher = new ManagementObjectSearcher (scope, query); ManagementObjectCollection col = searcher.Get(); foreach (ManagementObject o in col ) { //オーナーと名称を取得してみる。 string owner = o ["Owner"].ToString(); string name = o ["Name"].ToString(); MessageBox.Show(string.Format("Owner={0:s}/Name={1:s}",owner,name)); } B『SCHTASKSコマンド』案に関して 下記理由から無理そうです。 ・Win2000(SP4)でも動作保証が必要なこと ・ユーザを指定する都合上、パスワード入力は必須のため (ATコマンドと同様の理由のため) MSの英語資料は、奥が深いですね... (WMI、WQLなどのコア部分?は、日本語ドキュメントがなさ過ぎますね。) もうちょっと粘って読んでみます。 指摘事項などありましたら、よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2005-12-22 11:34
Win32 APIならば
NetScheduleJobAddなど。 | ||||||||||||||||
|
投稿日時: 2005-12-22 15:07
必要ありません。 仮に C/C++ のヘッダや Lib があったとしても、それらを直接 C# から利用することは出来ません。
いくつかの条件を満たしていないと表示されないです。
これも、特定の条件を満たしてないとそうなります。 ひょっとして、Mstask.tlb のような型情報を収めた専用ファイルがあれば、それを参照設定してみてください。
API が COM で公開されている以上、COM に関する基本的な知識が必要です。 それが無ければ、IDE の力も借りられない状態では手も足も出ません。 ヘルプからだと読み取りにくいかもしれませんが、「参照設定」できない COM オブジェクトは、以下の手順で利用します。 ・使用するインターフェースを自分の使う言語用に書き下ろす。 ・CoCreateInstance() API により、使用する COM オブジェクトのインスタンスを生成する。 ・オブジェクトインスタンスの参照をインターフェースでキャストし、必要なメソッドを呼び出す。 |