<   2010年 12月 ( 5 )   > この月の画像一覧
(Windows)NTFSアクセス権表示方法
共有フォルダ配下のアクセス権をきめ細かくしたいときは、共有フォルダは Everyone フルコントロールにして、NTFSアクセス権で細かく制御するのがオーソドックな方法です。

しかし、いざ運用段階に入ってアクセス権を確認したい時にいちいちフォルダのプロパティから確認するのは非常にめんどうです。
で、複数フォルダを簡単に表示するフリーなツールが無いかと思い探してみました。

まず見つけたのがMicrosoftのフォルダ-アクセス権マップツールです。
http://www.microsoft.com/japan/windowsserver2003/activedirectory/ACL.mspxからダウンロードできます。
VisioとExcel形式に出力できるようなんですが、3流PGの環境だとインストール時にVBScriptのレジストリ取得部分で落ちてしまい、インストールできませんでした。

次に見つけたのが、ACL Viewerというものです。
ただこれはネットワーク上のサーバが指定できないのと、複数のフォルダを同時に表示することができない、外部ファイルにエクスポートできないなどの機能的制約が多いのであまり今回は使えそうにありません。

最終的にWindows付属の cacls.exe を使うことにしました。
これだとUNCパスも指定できますし、*を付けることで複数フォルダを対象にできます。
下記のような例になります。

D:\>cacls \\10.0.0.100\share\*
\\10.0.0.100\share\test01 HOGEDOMAIN\hogegroup1:(OI)(CI)C
HOGEDOMAIN\hogegroup2:(OI)(CI)R
BUILTIN\Administrators:(OI)(CI)F
CREATOR OWNER:(OI)(CI)(IO)F
HOGEDOMAIN\Gp_information:(OI)(CI)F
NT AUTHORITY\SYSTEM:(OI)(CI)F

\\10.0.0.100\share\test02 HOGEDOMAIN\106153:(OI)(CI)C
HOGEDOMAIN\hogeuser01:(OI)(CI)R
HOGEDOMAIN\hogeuser02:(OI)(CI)R
HOGEDOMAIN\hogeuser03:(OI)(CI)C
HOGEDOMAIN\hogeuser04:(OI)(CI)C
BUILTIN\Administrators:(OI)(CI)F
CREATOR OWNER:(OI)(CI)(IO)F
NT AUTHORITY\SYSTEM:(OI)(CI)F


ただ、サブフォルダまで指定できないのが残念です。

cacls.exeについては、cacls.exe を使ってACL(NTFSアクセス権)を設定するでも詳しく取り上げてます。

参考:
「フォルダ-アクセス権マップツール」でフォルダのアクセス権一覧を取得する - @IT
[PR]
by jehoshaphat | 2010-12-12 17:38 | 豆知識 | Trackback | Comments(0)
(Linux)sudoを使って他のユーザでtomcatの起動停止ができるようにする
CentOS5.3 に Tomcat6 を入れてみたでLinux(CentOS)でTomcatを入れました。
この時 root ユーザでインストールしたので、起動スクリプトを使った起動停止処理が root でしかできません。

これを任意の他のユーザでも起動停止処理をしたいというのが今回の要件です。

この場合 sudo コマンドを使ってスクリプトを起動します。sudo により特権ユーザでの処理が可能になります。

sudo を使うとパスワードを要求されますが、これは自身のパスワードを入れるようです。
(例えば user01 が sodo を使ったなら user01 のパスワードを入れます。)


ただ、sudo コマンドはデフォルトでは一般ユーザは使用できないようになっているようです。
例えばパーミッションが 700 (所有者root)になっているスクリプトを一般ユーザ user01 で sudo で実行しようとすると下記のようになります。

[user01@localhost ~]$ sudo /a.sh
パスワード:(user01のパスワードを入れる)
Sorry, user devlop is not allowed to execute '/a.sh' as root on localhost.


なので任意のユーザに対してsudoで許可するコマンドを設定してやらないといけません。

設定は visudo コマンドで行います。(viでやると構文チェックが行われないのでvisudoじゃないとダメみたいです。)
visudo をすると設定ファイルの編集画面が出てくるので、そこで設定を追加するようですね。

書式は下記のような感じだそうです。

ユーザ ホスト = (権限) コマンド


例えばuser01に対して、全端末で全コマンドにroot権限を与えるには下記のように書けばいいようです。

user01 ALL = (ALL) ALL


パスワードを入れずにsudoを実行できるようにするにはコマンドの前に NOPASSWD: を入れるといいようです。

user01 ALL = (ALL) NOPASSWD:ALL


さて、今回はtomcatの起動スクリプトをuser01に実行させたいのでこう書きました。

user01 ALL =(root) NOPASSWD:/etc/rc.d/init.d/tomcat


グループに対して許可を与える場合は、%グループ名 で指定すればいいようです。
hogegグループに全端末全コマンドでroot権限を与えるためには下記のようにします。

%hogeg ALL = (ALL) ALL




参考:
sudo による管理者権限の付与
UNIXの部屋 コマンド検索:sudo (*BSD/Linux)
[PR]
by jehoshaphat | 2010-12-12 17:29 | Linux | Trackback | Comments(0)
(Windows)ログオン・ログアウトをイベントログから解析する

ターミナルサーバでユーザがリモートデスクトップでログイン・ログアウトしてる情報を取りたいという要件です。

これらの情報はサーバのイベントログ→セキュリティに記録されています。


ただイベントログは分かりづらいんですよね。


取りあえず実際にログイン、ロック、ロック解除、ログオフを行って、その時にどのようなイベントが出力されるか実験してみました。
結果は下記のとおりです。


●ログイン時
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:552
日付:2010/07/26
時刻:16:31:34
ユーザー:NT AUTHORITY\SYSTEM
コンピュータ:TESTSV
説明:
明示的な資格情報を使ったログオン試行:
ログオンしたユーザー:
ユーザー名:TESTSV$
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x000)
ログオン GUID:-
資格情報に使われたユーザー:
ターゲット ユーザー名:hogeuser
ターゲット ドメイン:HOGEDOMAIN
ターゲット ログオン GUID: {xxxx}

ターゲット サーバー名:localhost
ターゲット情報:localhost
呼び出し側プロセス ID:3700
ソース ネットワーク アドレス:10.0.1.100
ソース ポート:4359
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:528
日付:2010/07/26
時刻:16:31:34
ユーザー:HOGEDOMAIN\hogeuser
コンピュータ:TESTSV
説明:
ログオンの成功:
ユーザー名:hogeuser
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x000)
ログオンの種類:10
ログオン プロセス:User32
認証パッケージ:Negotiate
ワークステーション名:TESTSV
ログオン GUID:{xxxx}
呼び出し側ユーザー名:TESTSV$
呼び出し側ドメイン:HOGEDOMAIN
呼び出し側ログオン ID:(0x0,0x000)
呼び出し側プロセス ID: 3700
移行されたサービス: -
ソース ネットワーク アドレス:10.0.1.100
ソース ポート:4359
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:552
日付:2010/07/26
時刻:16:31:35
ユーザー:HOGEDOMAIN\hogeuser
コンピュータ:TESTSV
説明:
明示的な資格情報を使ったログオン試行:
ログオンしたユーザー:
ユーザー名:hogeuser
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x000)
ログオン GUID:{xxxx}
資格情報に使われたユーザー:
ターゲット ユーザー名:administrator
ターゲット ドメイン:HOGEDOMAIN
ターゲット ログオン GUID: {xxxx}

ターゲット サーバー名:localhost
ターゲット情報:localhost
呼び出し側プロセス ID:816
ソース ネットワーク アドレス:-
ソース ポート:-
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:528
日付:2010/07/26
時刻:16:31:35
ユーザー:HOGEDOMAIN\administrator
コンピュータ:TESTSV
説明:
ログオンの成功:
ユーザー名:administrator
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x2BBBEF20)
ログオンの種類:2
ログオン プロセス:seclogon
認証パッケージ:Negotiate
ワークステーション名:TESTSV
ログオン GUID:{xxxx}
呼び出し側ユーザー名:hogeuser
呼び出し側ドメイン:HOGEDOMAIN
呼び出し側ログオン ID:(0x0,0x000)
呼び出し側プロセス ID: 816
移行されたサービス: -
ソース ネットワーク アドレス:-
ソース ポート:-
-------------------------------------------

ログイン時はイベントID 528(ログイン) がログインユーザとAdministratorでそれぞれ出て、イベントID 552 がログインユーザとSYSTEMでそれぞれ出力されるようです。
(リモートデスクトップ接続なのでログインの種類は10になってます。)


ロック時は特にイベントに残っていませんでした。

●ロック解除時
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:552
日付:2010/07/26
時刻:16:37:45
ユーザー:NT AUTHORITY\SYSTEM
コンピュータ:TESTSV
説明:
明示的な資格情報を使ったログオン試行:
ログオンしたユーザー:
ユーザー名:TESTSV$
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x000)
ログオン GUID:-
資格情報に使われたユーザー:
ターゲット ユーザー名:hogeuser
ターゲット ドメイン:HOGEDOMAIN
ターゲット ログオン GUID: {xxxx}

ターゲット サーバー名:localhost
ターゲット情報:localhost
呼び出し側プロセス ID:3700
ソース ネットワーク アドレス:10.0.1.100
ソース ポート:4359
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:528
日付:2010/07/26
時刻:16:37:45
ユーザー:HOGEDOMAIN\hogeuser
コンピュータ:TESTSV
説明:
ログオンの成功:
ユーザー名:hogeuser
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x000)
ログオンの種類:7
ログオン プロセス:User32
認証パッケージ:Negotiate
ワークステーション名:TESTSV
ログオン GUID:{xxxx}
呼び出し側ユーザー名:TESTSV$
呼び出し側ドメイン:HOGEDOMAIN
呼び出し側ログオン ID:(0x0,0x000)
呼び出し側プロセス ID: 3700
移行されたサービス: -
ソース ネットワーク アドレス:10.0.1.100
ソース ポート:4359
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:538
日付:2010/07/26
時刻:16:37:45
ユーザー:HOGEDOMAIN\hogeuser
コンピュータ:TESTSV
説明:
ユーザーのログオフ:
ユーザー名:hogeuser
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x000)
ログオンの種類:7
-------------------------------------------

ロック解除時はイベントID 528(ログイン),538(ログアウト) がログインユーザで出るようです。なぜログオン・ログアウトの両方がでるのかよくわかりません。
またSYSTEMでイベントID 552 が出ています。
(ロック解除なのでログインの種類は7になってます。)


●ログオフ時
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:551
日付:2010/07/26
時刻:16:40:04
ユーザー:HOGEDOMAIN\hogeuser
コンピュータ:TESTSV
説明:
ログオフを開始したユーザー:
ユーザー名:hogeuser
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x000)
-------------------------------------------
イベントの種類:成功の監査
イベント ソース:Security
イベント カテゴリ:ログオン/ログオフ
イベント ID:538
日付:2010/07/26
時刻:16:40:06
ユーザー:HOGEDOMAIN\hogeuser
コンピュータ:TESTSV
説明:
ユーザーのログオフ:
ユーザー名:hogeuser
ドメイン:HOGEDOMAIN
ログオン ID:(0x0,0x000)
ログオンの種類:10
-------------------------------------------

ログアウトの時はイベントID 538(ログアウト),551(ログオフ開始) が該当ログインユーザで出るようです。

ログオン・ログオフに関係するイベントIDの詳細は、MS Technet:ログオン イベントの監査ファイルサーバー監査(ログオン/ログオフ) | Windowsイベントログ - WhiteFoxが参考になります。


ログオン・ログオフには該当ユーザ以外にもAdministrator,SYSTEMが絡んでくるようです。
しかし鬱陶しいので該当ユーザだけで抽出した方がよさそうですね。


さて、イベントログは今回の使用率の用に何かの統計を取るのには非常に不向きです。
CSVでエクスポートしてもそっから加工してやるのは一苦労なフォーマットになっています。


このイベントログを解析してくれるツールが無いものかと探したら、マイクロソフトが提供している Log Parser というツールが結構使えるようです。
なので早速試してみました。
ダウンロードはMSダウンロードセンター:ダウンロードの詳細 : Log Parser 2.2 日本語版から行えます。


SQLみたいなクエリを書くことで幅広い集計や抽出ができるようです。
使い方は、Log Parserの概要 - @ITLog Parserでログを統合的に扱い運用保守に役立てる(基本編)(1/4):CodeZineが参考になります。

クエリ構文や関数の詳細はツールに同封のヘルプファイル(ちゃんと日本語)が役立ちます。

とりあえず下記クエリを query02.txt として保存し、LogParserにかけてみました。(外部クエリファイルが使えるのもうれしいです。)

SELECT * 
INTO res1.csv
FROM TESTSV.evt
WHERE eventid IN (528;538) /*ログオン・ログアウトのみ*/
AND Strings LIKE 'hogeuser%' /*指定したユーザのみ*/
AND TimeGenerated > '2010-07-10 00:00:00'
ORDER BY TimeGenerated DESC


C:\Program Files\Log Parser 2.2>LogParser.exe -i:EVT -o:CSV file:query02.txt

統計情報:
---------
処理された要素: 59976
出力された要素: 8
実行時間: 2.42 秒

結果はこんなCSVで出てきます。(横に長いので見にくいですが....)

EventLogRecordNumberTimeGeneratedTimeWrittenEventIDEventTypeEventTypeNameEventCategoryEventCategoryNameSourceNameStringsComputerNameSIDMessageData
C:\Program Files\Log Parser 2.2\TESTSV.evt8172682010/07/26 16:402010/07/26 16:405388Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10TESTSVS-1-5-21-xxxユーザーのログオフ: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10
C:\Program Files\Log Parser 2.2\TESTSV.evt8172632010/07/26 16:372010/07/26 16:375288Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|7|User32 |Negotiate|TESTSV|{xxx}|TESTSV$|HOGEDOMAIN|(0x0,0x000)|3700|-|10.0.1.100|4359TESTSVS-1-5-21-xxxログオンの成功: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 7 ログオン プロセス: User32 認証パッケージ: Negotiate ワークステーション名: TESTSV ログオン GUID: {xxx}
C:\Program Files\Log Parser 2.2\TESTSV.evt8172642010/07/26 16:372010/07/26 16:375388Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|7TESTSVS-1-5-21-xxxユーザーのログオフ: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 7
C:\Program Files\Log Parser 2.2\TESTSV.evt8172472010/07/26 16:312010/07/26 16:315288Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10|User32 |Negotiate|TESTSV|{xxx}|TESTSV$|HOGEDOMAIN|(0x0,0x000)|3700|-|10.0.1.100|4359TESTSVS-1-5-21-xxxログオンの成功: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10 ログオン プロセス: User32 認証パッケージ: Negotiate ワークステーション名: TESTSV ログオン GUID: {xxx}
C:\Program Files\Log Parser 2.2\TESTSV.evt8170822010/07/26 15:012010/07/26 15:015388Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10TESTSVS-1-5-21-xxxユーザーのログオフ: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10
C:\Program Files\Log Parser 2.2\TESTSV.evt8170572010/07/26 14:502010/07/26 14:505388Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10TESTSVS-1-5-21-xxxユーザーのログオフ: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10
C:\Program Files\Log Parser 2.2\TESTSV.evt8170542010/07/26 14:502010/07/26 14:505288Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10|User32 |Negotiate|TESTSV|{xxx}|TESTSV$|HOGEDOMAIN|(0x0,0x000)|7384|-|192.168.125.224|3258TESTSVS-1-5-21-xxxログオンの成功: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10 ログオン プロセス: User32 認証パッケージ: Negotiate ワークステーション名: TESTSV ログオン GUID: {xxx}
C:\Program Files\Log Parser 2.2\TESTSV.evt8170262010/07/26 14:392010/07/26 14:395288Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10|User32 |Negotiate|TESTSV|{xxx}|TESTSV$|HOGEDOMAIN|(0x0,0x000)|2552|-|10.0.1.100|3156TESTSVS-1-5-21-xxxログオンの成功: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10 ログオン プロセス: User32 認証パッケージ: Negotiate ワークステーション名: TESTSV ログオン GUID: {xxx}

Log Parserでイベントログを出すとフィールドが全部で15個しか出てこず、ユーザ名やドメイン名、ログオンの種類などの情報が連結されて Strings や Message に入ってしまいます。Strings では | が区切り文字に、Message は : が区切り文字になってるようですね。

しかし、Log Parserには様々な関数が用意されており、このような任意の区切り文字で分割し、指定された部分を取得するなんてこともできるようです。
なので上記のユーザ名を条件にする部分も関数を使えばきれいにかけます。
こんな感じです。(ついでにログオンの種類を10つまりリモートデスクトップのみの接続の条件を付け加えてます。)

SELECT * 
INTO res1.csv
FROM TESTSV.evt
WHERE eventid IN (528;538) /*ログオン・ログアウトのみ*/
AND EXTRACT_TOKEN( Strings , 3 , '|') = 'hogeuser' /*指定したユーザのみ(区切関数使用)*/
AND EXTRACT_TOKEN( Strings , 3 , '|') = '10' /*リモートデスクトップ接続のみ*/
AND TimeGenerated > '2010-07-10 00:00:00'
ORDER BY TimeGenerated DESC

今回の要件は指定した期間で各ユーザがログイン・ログアウトを一日どれくらい行っているかを知りたいので下記のようなクエリとしました。
集計関数を使って回数を求めます。


SELECT TO_DATE(TimeGenerated) , EXTRACT_TOKEN( Strings , 0 , '|'), COUNT(EXTRACT_TOKEN( Strings , 0 , '|')) 

INTO res1.csv
FROM TESTSV.evt
WHERE eventid IN (528;538)
AND EXTRACT_TOKEN( Strings , 0 , '|') NOT LIKE 'Administrator'
AND EXTRACT_TOKEN( Strings , 0 , '|') NOT LIKE 'TESTSV$'
AND EXTRACT_TOKEN( Strings , 0 , '|') NOT LIKE 'ANONYMOUS LOGON'
AND TimeGenerated > '2010-07-10 00:00:00'
AND EXTRACT_TOKEN( Strings , 3 , '|') = '10'
GROUP BY EXTRACT_TOKEN( Strings , 0 , '|') , TO_DATE(TimeGenerated)
ORDER BY TO_DATE(TimeGenerated) , EXTRACT_TOKEN( Strings , 0 , '|') ASC

ORDER BY の注意点ですが、普通のSQLだと指定した列ごとに ASC , DESC を指定できますが、Log Parserだと ORDER BY 句全体で一つのASCまたはDESCしか指定できないようです。また、ORDER BY句は最後の句になる必要があるようです。

ORDER BY clm1 ASC , clm2 DESC
/*上はNGで下ならOKということになります。*/
ORDER BY clm1 , clm2 DESC


Log ParserからOfficeを使ってチャート(グラフ)を作ったり、SQL Server に出力したりすることもできるようですね。
まぁふつうはCSVにさえ出てくれば後は自由に加工できるんで助かるんですが。。。
また、今回は取り上げませんでしたがクエリを外部ファイルにした時にパラメータを動的に変更することもできるようです。詳しくは参考元の@ITの記事が役立ちます。
[PR]
by jehoshaphat | 2010-12-12 17:21 | 豆知識 | Trackback | Comments(0)
(.Net)アプリ上で共有フォルダの認証を行いファイルアクセスをする
ドメインに参加してないPC上で動く.Netアプリケーションから、ドメイン内のファイルサーバにアクセスしたいと言う要件です。

当然.Netアプリケーション内で共有フォルダの認証を行わなくてはなりません。


で、調べるとプログラム上で認証情報(アカウントとパスワード)をセットして、ネットワーク上に共有されたファイルをコピーする - ComponentGeek Articleにどんぴしゃな情報が載ってました。

.Net のクラスライブラリ自体にはそのような機能は提供されてないようなので、Windows API を使うことになるようです。

WNetAddConnection2 というAPIと WNetAddConnection3 というAPIがあるようです。違いは後者は"ネットワーク資源のプロバイダがダイアログボックスのオーナーウィンドウとして利用できるウィンドウのハンドルという1つのパラメータが追加されている"だけのようです。要は3の方は認証ダイアログウィンドウのハンドルを指定することができるようです。
(WNetAddConnectionってのもあるようですが16bit版みたいです。)


ちなみに、WNetAddConnection2 で接続する前にすでに対象の共有フォルダに接続されている場合はERROR_SESSION_CREDENTIAL_CONFLICT(1219)のエラーが返ります。
なので一旦 WNetCancelConnection2 で現在の接続を切断してからつなぐ方が安心かもしれません。

ということで一旦切断してから接続するサンプルコードです。(C#)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
 
public partial class Main : Form
{
//接続切断するWin32 API を宣言
[DllImport("mpr.dll", EntryPoint = "WNetCancelConnection2", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern int WNetCancelConnection2(string lpName, Int32 dwFlags, bool fForce);
 
//認証情報を使って接続するWin32 API宣言
[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern int WNetAddConnection2(ref NETRESOURCE lpNetResource, string lpPassword, string lpUsername, Int32 dwFlags);
//WNetAddConnection2に渡す接続の詳細情報の構造体
[StructLayout(LayoutKind.Sequential)]
internal struct NETRESOURCE
{
public int dwScope;//列挙の範囲
public int dwType;//リソースタイプ
public int dwDisplayType;//表示オブジェクト
public int dwUsage;//リソースの使用方法
[MarshalAs(UnmanagedType.LPWStr)]
public string lpLocalName;//ローカルデバイス名。使わないならNULL。
[MarshalAs(UnmanagedType.LPWStr)]
public string lpRemoteName;//リモートネットワーク名。使わないならNULL
[MarshalAs(UnmanagedType.LPWStr)]
public string lpComment;//ネットワーク内の提供者に提供された文字列
[MarshalAs(UnmanagedType.LPWStr)]
public string lpProvider;//リソースを所有しているプロバイダ名
}
 
 
private void button1_Click(object sender, EventArgs e)
{
string destFilePath = @"C:\test.txt"; // コピー先のローカルパス
string sourceFilePath = @"\\filesv\共有フォルダ\test.txt"; // コピー対象の共有されたファイルのUNCパス
string shareName = @"\\filesv\フォルダ"; // 共有パス \\sparePC\C$などもOK
try
{
//とりあえずコピーできるかやってみる
System.IO.File.Delete(destFilePath);
System.IO.File.Copy(sourceFilePath, destFilePath);
}
//認証に失敗すると UnauthorizedAccessException が発生する(Exceptionでキャッチしてもいいかも)
catch (UnauthorizedAccessException)
{
// 接続情報を設定
NETRESOURCE netResource = new NETRESOURCE();
netResource.dwScope = 0;
netResource.dwType = 1;
netResource.dwDisplayType = 0;
netResource.dwUsage = 0;
netResource.lpLocalName = ""; // ネットワークドライブにする場合は"z:"などドライブレター設定
netResource.lpRemoteName = shareName;
netResource.lpProvider = "";
 
string password = "passwd";
string userId = @"hogedomain.local\hoge";
 
int ret = 0;
try
{
//既に接続してる場合があるので一旦切断する
ret = WNetCancelConnection2(shareName, 0, true);
//共有フォルダに認証情報を使って接続
ret = WNetAddConnection2(ref netResource, password, userId, 0);
}
catch (Exception)
{
//エラー処理
}
Console.WriteLine(ret);
//ファイルコピー
System.IO.File.Delete(destFilePath);
System.IO.File.Copy(sourceFilePath, destFilePath);
 
}
Console.WriteLine("終了");
Console.ReadLine();
}
}

なお NETRESOURCE 構造体に設定できるのは下記の値になるようです。

dwScope(列挙の範囲)
RESOURCE_CONNECTED(0x1) 現在接続されたリソースを列挙する。dwUsageメンバーを指定できない。
RESOURCE_GLOBALNET(0x2) ネットワークに関するすべてのリソースを列挙する。
RESOURCE_REMEMBERED(0x3) 接続を列挙する。dwUsageメンバーを指定できない。


dwType(リソースタイプ)
RESOURCETYPE_ANY(0x0) すべてのリソース
RESOURCETYPE_DISK(0x1) ディスクリソース
RESOURCETYPE_PRINT(0x2) プリンタリソース

dwDisplayType(表示オブジェクト)
RESOURCEDISPLAYTYPE_DOMAIN(0x1) ドメインオブジェクトを表示する
RESOURCEDISPLAYTYPE_SERVER(0x2) サーバオブジェクトを表示する
RESOURCEDISPLAYTYPE_SHARE(0x3) シェアオブジェクトを表示する
RESOURCEDISPLAYTYPE_GENERIC(0x0) オブジェクトの表示は重要ではないことを示す

dwUsage(リソースの使用方法)
RESOURCEUSAGE_CONNECTABLE(0x1) 接続可能なリソースであることを示す。lpRemoteNameメンバーによって示された名前はWNetAddConnection機能に通過できる。
RESOURCEUSAGE_CONTAINER(0x2) リソースはコンテナリソースです。lpRemoteNameメンバーによって示された名前はWNetOpenEnum機能に通過できる。


MSDNには構造体に指定できる値を書いてるんですが、定数で書いてるんですよね。.Netだとその定数が使えないので実値を指定しないといけません。.NetでもWindowsの定数使えないものですかね。。。


APIの戻りのエラーコードはWin32エラーコード一覧が参考になります。
[PR]
by jehoshaphat | 2010-12-08 00:12 | .Net開発 | Trackback | Comments(0)
Network Notepadを使ってみた
ネットワーク図を書く必要が出てきました。今までは Visio で書いてたんですが、今のPCには入っていません。
ということで、フリーでネットワーク図をかけるツールを探したところ、Network Notepad というのが定番みたいなので使ってみました。


ダウンロードはhttp://www.networknotepad.com/download.htmlからできます。

ダウンロードページに、「Object Library2 and Library3 Icons」や「Hubs and Switches Library」などがありますが、これらをダウンロードし解凍したファイルを C:\Program Files\Network Notepad\objects 配下に置くと追加のアイコンが使えるようになります。

日本語にするにはメニューバーの
File→Setup→Language
から設定できます。

ネットワーク機器やサーバ類を図に置くには、ツールバーのオブジェクトライブラリからできるようです。
e0091163_041857.jpg


オブジェクトを右クリックしてプロパティから、名称やIPアドレスが設定できます。
e0091163_041836.jpg


ここでIPを設定すると、オブジェクト右クリックから、PingやTelnetができこれは非常に便利ですね。
e0091163_041915.jpg


右クリックしながらドラッグすると、表示している部分を移動する(スクロール)ことができます。ちょうど手のひらツールみたいな感じですね。

また、オブジェクトを移動するには、Shift+左クリックドラッグのようです。

ここら辺の操作はCADのようにちょっと特殊なので慣れが必要ですね。

注意が必要なのはオブジェクトのテキストで日本語を入れると文字化けします。
デフォルトのフォントが問題ですね。
とりあえずテキストの上で右クリックし、フォントから日本語を扱えるフォントを選択し直せば文字化け解消できます。

一番のネックはオブジェクトとオブジェクトを結ぶリンクです。
リンクを引く時に、マウス左クリックすると、コネクタ(頂点)を増やせるんですが、一旦リンクを引いてしまうと後からコネクタを増やすということができないようです。
Visioとかだとこの辺は融通がきくんですけどね。

参考:
LANの構成や健康状態を調べたい - フリーソフト即効活用法:ITpro
Passion For The Future: ネットワーク図を作成するフリーソフト Network Notepad
ネットワーク図を書いてみた - trial and error
ネットワーク構成図の作り方 (第3回) わかりやすいネットワーク構成図を作成するためのポイント : ネットワーキング - Computerworld.jp
Network Notepadを使ってネットワーク図 « 旧SawanoBlog
Network Notepadを試す - tugeki!
[PR]
by jehoshaphat | 2010-12-08 00:06 | ツール | Trackback | Comments(0)