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

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

ただいまの
回答率

89.55%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 722

mercurian-teto

score 73

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

                }
            }


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mercurian-teto

    2019/02/24 11:29

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

    キャンセル

  • YAmaGNZ

    2019/02/24 20:52

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

    キャンセル

  • mercurian-teto

    2019/02/25 16:00 編集

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

    キャンセル

回答 4

checkベストアンサー

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/25 19:05

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

    キャンセル

0

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/25 19:07

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/24 17:25

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

    キャンセル

  • 2019/02/24 17:54

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

    キャンセル

-1

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

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/24 10:45

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

    キャンセル

  • 2019/02/24 11:20

    > 実際に作成したいアプリケーションを具体的に書いたものを上に追記しました。

    そのような目的のためにわざわざサーバーを立てるのは見当ハズレだと思います。

    個人の勉強のためということでしたらともかく、仕事の一環で行っているというようなことですと、サーバーを立てて管理するための知識の習得、Web アプリを作成・試験するための知識の習得、そのために必要な工数と費用などを考えると、ペイするとは全く思えません。

    Zuishin さんの意見に賛成です。

    キャンセル

  • 2019/02/24 18:40

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

    キャンセル

  • 2019/02/25 19:08 編集

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

    キャンセル

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

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • C#に関する質問
  • (Web or Local)PC上で常駐アプリが得たデータをシリアライズし、シリアライズした内容を管理者権限のないユーザーに編集させないようにする方法