題目の例を述べると、
C#の常駐アプリが記録したデータ
(記録したデータの例:特定のアプリケーションの使用時間)を
毎秒、計測し、そのとき得られた情報をwebサーバ上にシリアライズし、
サーバーがあるタイミングでweb上に保存されてある計測されたデータを
常駐アプリケーションに渡す
(タイミングの例:アプリケーションの使用時間が設定の1日2時間に達したら)
という常駐アプリを作成しようと思っています。
こういう風なアプリケーションって実現可能でしょうか。また、実際存在するのでしょうか。
こういうアプリケーションはC#以外の知識も必要でしょうか。
webサーバーにシリアライズするという手法をとると、シリアライズした情報を読み取ることができ、
なおかつ標準ユーザーにねつ造されないかと思ったのですが、(質問の背景を参考)違いますか。
回答お願いします。
#質問の背景
こういう風なアプリケーションを作成しようと思ったのは
普通にPC上にxmlや(windows)レジストリにシリアライズしようとすると、
管理者権限のない普通のユーザーに不正に書き換えられてしまうからです。
隠しファイルや隠しレジストリ等は使いたくありません。
xmlやレジストリに書き込みの制限をしようとすると
ユーザーの権限単位でしか書き換えを禁止するしかありません。
webサーバーにシリアライズするという手法をとると、シリアライズした情報を読み取ることができ、
なおかつ標準ユーザーにねつ造されないかと思い、質問しました。
#追記1.作成しようとしている常駐アプリケーション
アプリケーションの使用時間を毎秒、計測します。
常駐アプリケーションはタスク常駐のアプリケーションです。
たとえば、firefoxの使用時間を計測します。
具体的にはwindow名にfirefoxが含まれるウインドウが
一つでもあれば、使用時間を計測していきます。
(windowsでfirefoxのウインドウ名を取得するとかならず
**********- Mozilla Firefox
という名前になっています。
例:質問投稿画面|teratail(テラテイル) - Mozilla Firefox)
それをサーバー上にxml形式でシリアライズします。
サーバーはxml形式で保存されたデータを監視・常駐します。
サーバー側がfirefoxの使用時間が2時間に達したら、
それをサーバーが常駐アプリケーションに通知します。
firefoxの使用時間が0時間になれば、
常駐アプリケーションは
ウインドウ名にfirefoxが含まれるものを監視し、
そのようなウインドウ名があれば、
そのウインドウを出しているアプリケーションを(たとえば、firefoxを)強制終了します。
送られるデータは読み取られるのはかまわないのですが、
書き込んで常駐アプリケーションの挙動を不正に変更されるのを防ぎたいです。
上の例だと、常駐アプリケーションがfirefoxの使用時間が残り2分となっているのに50分とかに不正に書き換えて、常駐アプリの強制終了を免れたりされるのを防ぎたいです。
#追記2 ローカルではなくwebサーバーに保存しようと思った理由
回答ありがとうございます。ローカルで実現しようとすると、
シリアライズした情報への書き込み権限を標準ユーザーアカウントで
動作している常駐アプリのみにしたいですが、ローカルではできそうでないと思い、webサーバーに保存するという考えに至り質問しました。
また、本質問の追記修正で回答してくださっている方がシステムユーザー権限でwindowsサービスをすればいいとあったのですが、たとえば、標準ユーザーアカウントでprogramfilesに存在するxmlファイルに書き込みができるのであれば、ローカルでwindowsサービスを検討しようと思っています。
#追記3 実現したコード
protected override void OnStart(string[] args) { string filename = "C:\Program Files\LsXmlWriter\writetoPGF.xml"; // writetoPGF = write to ProgramFiles eventlog.WriteEntry("service has started"); XmlTextWriter writer = null; try { if (!Directory.Exists("C:\Program Files\LsXmlWriter")) { Directory.CreateDirectory("C:\Program Files\LsXmlWriter"); } writer = new XmlTextWriter(filename, null); writer.Formatting = Formatting.Indented; writer.WriteStartDocument(true); writer.WriteComment ("Asset hardware Inventory for " + System.Environment.MachineName); writer.WriteStartElement("property"); writer.WriteElementString("hour", "9"); writer.WriteElementString("minute", "0"); writer.WriteEndElement(); writer.WriteEndDocument(); } catch (Exception error2) { eventlog.WriteEntry(error2.Message); eventlog.WriteEntry("Can't write to xml files in ProgramFiles"); } finally { if (writer != null) { writer.Close(); } } }
回答4件
あなたの回答
tips
プレビュー