最新記事

月別アーカイブ(タブ)

dicdicのランニング

カウンタ (ホームページと合算)

リンク

最新トラックバック

検索フォーム

カテゴリ

QRコード

QR

:スポンサーサイト

--/--/-- (--) --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告

238:(ASP.NET v4.0 (C#)) アクセスしている人の情報(ユーザー名やコンピュータ名など)を取得する

2016/09/25 (Sun) 14:46
 (前回のログ出力の続き)
 システム開発の開始から間もないころ、ログの設計をする際に、
「アクセス者のOSユーザーID」や「クライアントマシン名」を吐き出したい
と言い出す人が(必ず)いて、
「ユーザーIDを取得するにはどうすんだっけ」となって
調べまわすということがよく起こる。
 ペース的には年に一回ぐらいかな。

やりクチ自体は、そう難しいものではないのだが、開発を
行っている環境やIISの設定によっては、うまく取得できなかったり、
意図しない値が返ってきて、「うーーーーん」と悩んだりする。

【クライアントマシン情報の取得】
まぁ、IPアドレスなら これ↓
Request.ServerVariables["REMOTE_ADDR"]
この返り値の文字列を、なんか(たとえばaaa)とかに容れといて、
System.Net.Dns.GetHostEntry(aaa).HostName
なんてしてやるとコンピュータ名が取得できる。

ところが、開発段階で調子に乗って、
Request.ServerVariables["LOCAL_ADDR"]
とか
Request.ServerVariables["SERVER_NAME"]
を使って、「よしよし取得できた」なんつって、
いざ公開してみると「うへーっ」ってことになっちゃう。

ローカルにモジュールを置いて開発していると、
サーバ=(いこーる)クライアントになっているから、
サーバ名が表示されているのに、クライアント名が
表示されているものと勘違い
し、スルーされ、
あとから気づいて大恥をかく。
(あっ、自分のことです。)
コンピュータ名も、名前解決できるかどうかによって、
ローカルで開発している場合と、モジュールをサーバに
あげて開発している場合では結果が異なることがある。
コピペでやっているとこういうことがしょっちゅう起きる。
(あっ、これも自分のことね。)
20160925a


【クライアントのログインユーザー情報の取得】
ログインユーザーも、そんなに難しいコトじゃない。
Request.ServerVariables["REMOTE_USER"]
Request.ServerVariables["LOGON_USER"]

あたりで取得できる。
[ドメイン名\ユーザー名]の形式になっているが、
情報は多いに超したことはない。
ドメイン名が邪魔なら¥マークより前をカットすればいい。
20160925b

あ、こっちにも失敗談あります。
ローカルで開発しているとね、コンピュータ名取得の失敗と
同じ理由でトラップにはまります。
間違って
System.Security.Principal.WindowsIdentity.GetCurrent().Name
なんかを使っちゃうと、ローカルで開発しているときは
バッチリ自分のユーザーIDが取得できて「よしよし」とかなっちゃう。
ところが、いざサーバーに公開してアクセスしてみると
IIS APPPOOL\ASP.NET v4.0
とかがバーンと表示されて、またまた恥ずかしい思いをする。

Environment.UserName
も同じ。 ローカルで開発中は自分のユーザーIDが表示されるが、
公開してクライアント側からつついたとたんに「ASP.NET v4.0」
となり、"サーバー側から見たローカル" としての立場から値を
返してく
るので注意。

なぜか、質問掲示板などで、この二つを回答として
エラそうに答える人がいるのだ。わざとかなぁ...



(ユーザー情報取得の補足)
IISの設定によっては、ユーザーIDを取得したつもりが、
Nullになって返ってくることがあります。 これは悲しい。
原因がIISの設定によるもの(匿名認証が「有効」になっている)
なのであれば、以下のような作業で解消できるかも。
①IISマネジャで対象のアプリを選択
②認証のアイコンをクリック
20160925c

③Windows認証を「有効」に変更
20160925d

④IISを再起動 (停止して、すぐ開始)

※環境によっては勝手にやるとむっちゃ怒られるので注意。

以上、次回この問題で自分が悩まないために。
スポンサーサイト

ASP.NET v4.0 (C#)コメント(0)トラックバック(0)|

237:(ASP.NET v4.0 (C#)) XMLを出力する(新規作成)、そして、追記する(ファイル既存確認)。

2016/09/21 (Wed) 23:29
 ログファイルに実行したSQL文とかを残そうとすると、SQLセンテンスの中に
カンマ(,)やら スペース( )やらコーテーション(")やら が入っていたりして、
区切り文字をどうするかで悩んだりする
たまたま、あるお客のwebDBシステムのログファイルを見る機会があって、
見てみたらなんと、ギリシャ文字が区切り文字としてこっそり使われていた。
これならSQL文中で使われることがないだろうと考えたのか.... 
しかしこれではちょっと格好が悪い。
こんなログ吐いてるって、お客のPMは知っているのかな..。

で、いろいろ考えた末、僕はxmlでログを吐いてみようということにした。
webで散々調べまわしたが...、
xmlを新規に作って要素を出力する方法はいくらでもヒットするのに、
そこに追記する方法はなかなか出てこない。
真っ当にTextStreamで開いて追記しようとすると、ルートエレメントの
閉じタグが邪魔
でなかなか面倒くさい。

と思ったら、C#の名前空間には「Xml.Linq」という便利なものがあって、
こいつをうまく使えば、xmlをTextStreamじゃなくて要素単位で扱える
ようになり、邪魔なルートエレメントの閉じタグをヒラリとかわすことが
できる (らしい) ということがわかってきた。

まず、Xml.Linqを参照できるようにしておいて....、
20160921a
using System.Xml.Linq;


こんなの書いてみた。
sql文(string)と、取得した行数(int)と、コメント(string)を受け取って、
日時とともにログ出力するメソッド。
20160921b

public void XMLLogOut(string Str1, int Num1, string Str2)
{
string DTTM = System.DateTime.Now.ToString();

//要素ごとに出力する内容を列挙
var PreLogLine = new XElement("LogLine");
PreLogLine.Add(new XElement("ELM_TME", DTTM));
PreLogLine.Add(new XElement("ELM_Str1", Str1));
PreLogLine.Add(new XElement("ELM_Num1", Num1));
PreLogLine.Add(new XElement("ELM_Str2", Str2));

//XMLファイル出力パス
string logfn = System.AppDomain.CurrentDomain.BaseDirectory + "test.xml";

//XML文書の作成
var AuditLog = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
AuditLog.Add(new XComment("コメントだじょ~")); //XMLコメントの追加
AuditLog.Add(new XElement("Root_Element")); //Root Elementの作成

if (System.IO.File.Exists(logfn))
{
//ファイルがあれば、現在のxmlをLoadしてAddしてSave
var xmlFile = XElement.Load(logfn);
xmlFile.Add(PreLogLine);
xmlFile.Save(logfn);
}
else
{
//ファイルがなければ、ノードをAddしてSave
AuditLog.Root.Add(PreLogLine);
AuditLog.Save(logfn);
} // if-else のおわり

} // XMLLogOutのおわり


まず、ファイルがない状態で実行するとファイルが生成されて、
その中に最初のログが書き込まれる。

【初回実行後の生成されたxmlファファイル】
20160921c

【2回目実行後】
20160921d
も一回実行すると、追記される。
最後の閉じタグ () の前に追記された。
これはさりげなく素晴らしい!

実際は、ファイル名を[YYMMDD].xmlにして、恒久的にログを
日次堆積管理できるようにして実装した。
使っていて気が付いたのだが、要素の内容にNullが渡されたり
した場合は、もちゃんとしてくれる。
(FC2ブログでタグを書くと表示されないのでテキストでは表現できない)
当たり前と言えは当たり前かも知れないが。

Excelでもちゃんと見れる。
20160921e

おっと。
気が付いてみると、2回目以降にコメントが残っていない。
(てゆか1回目で入ったコメントが消えてる)
まぁ、本質的な問題ではないので気にしないことにしよう... --;)

※エラー処理とか端折ってるので、丸写しは危険です。
 わたしアホなので、質問とかしてもムダです。 ご容赦を。

ASP.NET v4.0 (C#)コメント(0)トラックバック(0)|

ブログ TOP


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。