質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

4回答

499閲覧

(Web or Local)PC上で常駐アプリが得たデータをシリアライズし、シリアライズした内容を管理者権限のないユーザーに編集させないようにする方法

mercurian-teto

総合スコア75

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

1クリップ

投稿2019/02/23 18:03

編集2019/03/08 18:49

題目の例を述べると、
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(); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2019/02/24 01:46

サービスにして使用ユーザーの権限外に保存とか出来そうな気がしますがどうでしょう?
mercurian-teto

2019/02/24 01:51

追記・修正ありがとうございます。 サービスとはwindowsサービスもしくは サーバーのサービス?のことなんでしょうか。 サービスとは具体的に何を表しているのですか。
YAmaGNZ

2019/02/24 02:00

Windowsサービスとして作成し、SYSTEMユーザーで動作させるなどすれば、サーバへのアクセスは必要ないのではないかと思いました。
mercurian-teto

2019/02/24 02:29

返答ありがとうございます。たとえば、 管理者権限のない標準ユーザーのアカウントで windowsサービスがアプリケーションの使用時間を計測し、 programfilesに存在するxmlファイルにシリアライズするといったことが 可能なんでしょうか。
YAmaGNZ

2019/02/24 11:52

サービス実行アカウントをLocalSystemに指定し、C:\Program Files配下のフォルダへの書き込みを行うことは可能です。
mercurian-teto

2019/02/25 07:05 編集

windowsサービスをLocalSystemにし、Programfiles配下にxmlファイルを作成することができました!(詳しくは上の追記3) シリアライズはローカルで行い、windowsサービスのLocalSystemで実現しようと思います。 セッション0の分離の勉強が大変になりますが、頑張って勉強します。 最後にYAmaGNZさんの回答をベストアンサーにしたいのですが、よければ、下の回答欄で再度答えを記入してもらえませんか。お願いします。
guest

回答4

0

ベストアンサー

Windowsサービスとして作成し、起動ユーザーをLocalSystemとすろことにより
使用ユーザーの権限ではアクセスできない部分へのアクセスができるかと思います。

全てのユーザーで実行されているプロセスを取得することになるかと思いますので、ユーザー名を取得し判断してください。

投稿2019/02/25 09:49

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercurian-teto

2019/02/25 10:05

回答ありがとうございました。 頑張って実装します。
guest

0

わざわざそんなことをしなくても暗号化してローカルに保存し、管理者以外の閲覧権限を無くせばいいのではありませんか?

ウェブで保存もできなくはありませんが、侵入経路を増やしてセキュリティーを低下させるだけの気がします。

投稿2019/02/24 01:57

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercurian-teto

2019/02/24 08:25

回答ありがとうございます。 データの閲覧はいいのですが、データを改ざんして、常駐アプリケーションの挙動を変えることを防ぎたいです。追記1に書きました。
Zuishin

2019/02/24 08:54

権限が無い人は改ざんできません。
guest

0

質問者さんが「シリアライズ」「常駐アプリ」という言葉をどういう意味で使っているか不明ですが(誤解があるように見えますが)、要するに、

(1) クライアント PC の C# のアプリを使って「記録したデータ」を何らかの形でサーバーに送信、サーバーでデータを保持する。

(2) クライアント PC の C# のアプリを使って、あるタイミングでサーバーに要求を出し、サーバーに保持されたデータを取得して利用する。

・・・ということであろうと想像して、以下のような構成を考えてはいかがですか?

クライアント ⇔ 常駐アプリ(in クライアント PC) ⇔ ネット ⇔ Web サーバー ⇔ Web アプリ(in Web サーバー) ⇔ DB サーバー(SQL Server など)

一般的には「常駐アプリ」というところは IE, Chrome などのブラウザになりますが、普通の C# のアプリを使うことももちろん可能で、そういうケースは多々あります。

「常駐」というところが一般的な意味で言うところの常駐ということであるとするとホントかなという感じはしますが、それでも大きな違和感はないです。

投稿2019/02/24 01:40

編集2019/02/24 01:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercurian-teto

2019/02/24 01:45

回答ありがとうございます。 実際に作成したいアプリケーションを具体的に書いたものを上に追記しました。
退会済みユーザー

退会済みユーザー

2019/02/24 02:20

> 実際に作成したいアプリケーションを具体的に書いたものを上に追記しました。 そのような目的のためにわざわざサーバーを立てるのは見当ハズレだと思います。 個人の勉強のためということでしたらともかく、仕事の一環で行っているというようなことですと、サーバーを立てて管理するための知識の習得、Web アプリを作成・試験するための知識の習得、そのために必要な工数と費用などを考えると、ペイするとは全く思えません。 Zuishin さんの意見に賛成です。
mercurian-teto

2019/02/24 09:40

ローカルでの標準ユーザーアカウントでタスクバー常駐のアプリケーションもしくはlocalsystemで常駐するwindowsサービスが programfilesにほぞんされてあるxmlファイルに書き込むことができたら、webサーバーではなく、ローカルで検討しようと思っています。標準ユーザーアカウントで管理者権限で自動起動するものは探してみたのですが、全くありませんでした。
mercurian-teto

2019/02/25 10:08 編集

回答ありがとうございました。 結局ローカルの方法に収束しました。 webサーバーについて教えていただきありがとうございました。
guest

0

こういう風なアプリケーションって実現可能でしょうか。また、実際存在するのでしょうか。

どのあたりを気にされているのか今ひとつ分かりませんが、クラアントとサーバーが連携するアプリケーションは一般的に多く普及していると思います。

こういうアプリケーションはC#以外の知識も必要でしょうか。

サーバーサイドの知識(IIS や ASP.NET など)も必要になりますね。

webサーバーにシリアライズするという手法をとると、シリアライズした情報を読み取ることができ、

どの場所にどのようにデータを保存しようとも不正アクセス(捏造)の危険性はあります。
ユーザーにデータを読み取られたくないのであれば、サーバーに保存する場合もあらかじめデータを暗号化して送受信、保存するのが良いでしょう。

投稿2019/02/23 22:48

nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercurian-teto

2019/02/25 10:07

回答ありがとうございました。 結局ローカルの法に収束しました。 webサーバーについて教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問