統合Windows認証を用いると、ASP.NETでほぼ何もしなくてもサイトにセキュリティをかけることができます。


また、Windowsのログイン情報も取得することができます。


ですので、LAN内のポータルサイトでログイン画面を作らずしてログインユーザのActiveDirectory内で管理してりう情報を引き出すことが可能です。

(InternetExplorer限定ですが)


-- code -----------


System.DirectoryServices.DirectoryEntry directoryEntry = new System.DirectoryServices.DirectoryEntry("ldap://activedirectoryserver ", domainUser, password);


System.DirectoryServices.DirectorySearcher search = new System.DirectoryServices.DirectorySearcher(directoryEntry);


System.Security.Principal.IIdentity identity = (System.Security.Principal.IIdentity)User.Identity;

search.Filter = string.Format("(sAMAccountName={0})", identity.Name);

System.DirectoryServices.SearchResult result = search.FindOne();

System.DirectoryServices.DirectoryEntry resultEntry = result.GetDirectoryEntry();


string UserName = resultEntry .Properties["cn"].Value.ToString();


------------------


コードを断片的に記載しましたが、こんな感じでUserNameにはActiveDirectory上で登録されている氏名が抽出できます。


順を追って説明しますと、まずエントリを作成します。

(部署内だけを検索したい場合は

ldap://activedirectoryserver/cn =部署xxxxxxxxxx

みたいな入力をします。)

この際にActiveDirectoryに検索が可能なユーザとパスワードを指定します。

例:test.localにログインする際に[develop]、[p@ssword]を入力してログインする場合

domainUser = test.local\develop

password = p@ssword


その後、検索を実行するオブジェクトに検索先のエントリをセットします。


ログイン名自体はエントリ名ではないので、ログイン名を持つエントリを探しすようにフィルタを設定します。


統合Windows認証の場合ASP.NETではHttpApplicationクラス内のUserプロパティ内に認証情報が格納されています。そこからログイン名を取得します。


検索を実行し、帰ってきたエントリのProperites内のcnを変数に格納してます。



いかがでしょうか、ログインIDやパスワードの入力を求めなくてもActiveDirectory内の氏名が表示されたかと思います。


GridViewを使うと、DataSet内のデータを数行で一覧で表示する事が可能です。
(GridViewは.NET Framework2.0以降のクラスです。)

-- code ------------

// DataSet ds内にFriendsというDataTableが存在する場合
gv.DataMember = "Friends";
gv.DataSource = ds;
gv.DataBind();

--------------------

ただし、データベース内のデータをSqlDataAdapterやSqlDataSourceを用いて抽出し、一覧で表示しようとすると日付型の場合は時間まで表示されてしまいます。

日付型で時間を使っていない場合は邪魔なので取ってしまいたい場合にフォーマットを指定することが可能です。

日付型は基本ToStringメソッドで書式を指定する事が可能です。

-- code ----------

DateTime.Now.ToString("yyyy/MM/dd");

------------------

といった具合に。

ただし、今回はコンピュータ内で自動で値を生成してますので、こういった制御ができません。

これを解決するにはGridViewに直接書式を指定します。

GridViewに直接といいましたが、厳密にはGridViewのプロパティColumnsの各要素に設定をします。

VisualStudioで作っている人はデザイナの下部にある、”ソース”をクリックするとソースが表示されますので、GridViewの定義を確認すると、各カラム定義が書かれてると思います。

ここで、書式を指定したいカラムの属性を次のようにします。

-- code ---------------

<asp:BoundField DataField="Birthday" HeaderText="生年月日" HtmlEncode="false" DataFormatString="{0:yyyy/MM/dd}" />

-----------------------

DataField
DataTable内のDataColumnのNameプロパティ

HeaderText
ヘッダーのテキスト

HtmlEncode
ここがtrueですと、DataFormatStringがそのまま出力されてしまいます。
ので、falseにします。
ただし、falseにするとセキュリティ上の問題もありますので、必要な時のみfalseにしましょう。

DataFormatString
ここでは、string.Formatメソッドの書式の指定と同様の方法で記載します。


以上で、時間が表示されなくなります。

応用で、数値を3桁のカンマ区切りで表記したりすることも可能です。

3桁のカンマ区切りのフォーマットは

{0:N0}

と記載します。

クリスタルレポートはVisualStudioのプロフェッショナルエディション以上に標準でアドオンされている帳票作成モジュールです。


ですので、ExpressEdtionの無償環境で開発をしている方は帳票を作る際に別の方法をとらなければなりません。


いろいろと方法はあるかもしれませんが、.NET Frameworkには標準で帳票を作成するためのクラス郡が準備されてます。


方法としては、

1.System.Drawing.Printing.PrintDocumentのインスタンスを作成する。

2.System.Drawing.Printing.PrintDocumentのインスタンスのGraphicsプロパティを利用し、描画をする

3.System.Drawing.Printing.PrintDocumentのPrintメソッドでプリンタに出力命令を送る

以上


コードで説明するとこうなります。


-- code ----------------

using System.Drawing;



private void Print(){

System.Drawing.Printing.PrintDocument myReport = new System.Drawing.Printing.PrintDocument();

myReport.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(myReport_PrintPage);

myReport.Print();

}



private void myReport_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev){

Graphics g = ev.Graphics;
Font font = new Font(fontFamilyName, 7);
g.DrawString("てすと", font, Brushes.Black, 5F, 5F);

}

-----------------------


Printメソッドが実行されると、PrintPageイベントが実行され、PrintPageEventArgsのGraphicsオブジェクトを用いて、印刷する文字や図形を書き込んでいきます。


その他、作成したSystem.Drawing.Printing.PrintDocumentをプレビューするためのWindowsコントロールもあります。

それが、

System.Windows.Forms.PrintPreviewControl

クラスです。


-- code ----------------


printPreviewControl1.Document = myReport;

------------------------


これだけでレポートがプレビューされます。


その他、DrawLineやFillRectangleを使えば柔軟なレポート作成が可能です。


ただし、マス等を計算しながら作らなければならないので、時間はかかるかと思います。