icacls.exe を使ってACL(NTFSアクセス権)を設定する
以前に、cacls.exe を使ってACL(NTFSアクセス権)を設定すると、xcacls.vbsを使って詳細なACL(NTFSアクセス権)を変更するでACLを設定する方法を書きました。

今回は、WindowsServer2003 SP2 から使えるようになった。icacls での設定方法です。
現在では、caclsよりも、icaclsを使うことが推奨されているようです。
(XPでicaclsを動かすには、xcaclsが使えないため、icaclsをXPで動かすようにしたを参照)


使い方は、icacls コマンドを叩くと、以下のヘルプが出てくるので、これを見れば大抵わかります。


>icacls

ICACLS <名前> /save <ACL ファイル> [/T] [/C] [/L] [/Q]
名前が一致するすべてのファイルとフォルダーの DACL を <ACL ファイル> に
格納して、後で /restore で指定できるようにします。SACL、所有者、整合性
ラベルは保存されません。

ICACLS <ディレクトリ> [/substitute <旧 SID> <新 SID> [...]] /restore:<ACL ファ
イル> [/C] [/L] [/Q]
格納されている DACL を <ディレクトリ> 内のファイルに適用します。

ICACLS <名前> /setowner <ユーザー> [/T] [/C] [/L] [/Q]
すべての一致する名前の所有者を変更します。このオプションは所有権の変更を
強制しません。所有権の変更を行うには、takeown.exe ユーティリティを使用し
ます。

ICACLS <名前> /findsid <SID> [/T] [/C] [/L] [/Q]
<SID> が明示されている ACL を含むすべての一致する名前を検索します。

ICACLS <名前> /verify [/T] [/C] [/L] [/Q]
ACL が正規の形式ではないか長さが ACE 数と一致しないすべてのファイルを
検索します。

ICACLS <名前> /reset [/T] [/C] [/L] [/Q]
すべての一致するファイルについて、ACL を継承された既定の ACL と置換します。

ICACLS <名前> [/grant[:r] <SID>:perm[...]]
[/deny <SID>:perm [...]]
[/remove[:g|:d]] <SID>[...]] [/T] [/C] [/L] [/Q]
[/setintegritylevel Level:policy[...]]

/grant[:r] <SID>:perm は、指定されたユーザー アクセス権を付与します。
:r を指定すると、以前に付与されたすべての明示的なアクセス許可は新しい
アクセス許可に置き換えられます。
:r を指定しない場合、新しいアクセス許可は以前に付与された明示的な
アクセス許可に追加されます。

/deny <SID>:perm は、指定されたユーザー アクセス権を明示的に否定します。
指定されたアクセス許可の明示的な否定 ACE が追加され、明示的な許可内容
に含まれた同じアクセス許可は削除されます。

/remove[:[g|d]] <SID> は、ACL 内にあるすべての <SID> を削除します。
:g を指定すると、その SID に対して許可されたすべての権限を ACL から
削除します。
:d を指定すると、その SID に対して否定されたすべての権限を ACL から
削除します。

/setintegritylevel [(CI)(OI)] レベルは、すべての一致するファイルに整合性
ACE を追加します。このレベルは次の 1 つとして指定されます。
L[ow]
M[edium]
H[igh]
整合性 ACE の継承オプションは、レベルの前に配置でき、
ディレクトリに対してのみ適用されます。

/inheritance:e|d|r
e - 継承を有効にします。
d - 継承を無効にし、ACE をコピーします。
r - 継承された ACE をすべて削除します。


注意:
<SID> は数値形式またはフレンドリ名形式で指定できます。数値形式の場合は、
SID の始めに * を付けます。

/T は、<名前> で指定されたディレクトリ以下のすべての一致するファイルと
ディレクトリに対してこの処理が実行されることを指定します。

/C は、どのようなファイル エラーが発生してもこの処理が続行されることを
指定します。ただしエラー メッセージは表示されます。

/L は、この処理がターゲットではなくシンボリック リンク自体に対して実行
されることを指定します。

/Q は、icacls が成功のメッセージを抑制することを指定します。

ICACLS は、ACE エントリの正規の順序を維持します:
明示的な否定内容
明示的な許可内容
継承された否定内容
継承された許可内容

perm はアクセス許可マスクであり、次の 2 種類の方法で指定できます:
単純な権限を列挙:
N - アクセス権なし
F - フル アクセス権
M - 変更アクセス権
RX - 読み取りと実行のアクセス権
R - 読み取り専用アクセス権
W - 書き込み専用アクセス権
D - 削除アクセス権
特定の権限をコンマ区切りでかっこ内に列挙:
DE - 削除
RC - 読み取り制御
WDAC - DAC の書き込み
WO - 所有者の書き込み
S - 同期
AS - システム セキュリティへのアクセス
MA - 無制限
GR - 一般的な読み取り
GW - 一般的な書き込み
GE - 一般的な実行
GA - 一般的なすべての操作
RD - データ読み取り/ディレクトリの一覧表示
WD - データ書き込み/ファイルの追加
AD - データの追加/サブディレクトリの追加
REA - 拡張属性の読み取り
WEA - 拡張属性の書き込み
X - 実行/スキャン
DC - 子の削除
RA - 属性の読み取り
WA - 属性の書き込み
継承権限はどちらの形式の前にも配置でき、ディレクトリにのみ適用され
ます:
(OI) - オブジェクト継承
(CI) - コンテナー継承
(IO) - 継承のみ
(NP) - 継承を適用しない
(I) - 親コンテナーから継承した権限

例:

icacls c:\windows\* /save <ACL ファイル> /T
- c:\windows より下にあるすべてのファイルとサブディレクトリの ACL を
<ACL ファイル> に保存します。

icacls c:\windows\ /restore <ACL ファイル>
- <ACL ファイル> 内のファイルのうち c:\windows とそのサブディレクトリ
内に存在するすべてのファイルの ACL を復元します。

icacls <ファイル> /grant Administrator:(D,WDAC)
- Administrator ユーザーに、<ファイル> に対する削除および DAC 書き込み
のアクセス許可を与えます。

icacls <ファイル> /grant *S-1-1-0:(D,WDAC)
- SID S-1-1-0 によって定義されたユーザーに、<ファイル> に対する削除
および DAC 書き込みのアクセス許可を与えます。






アクセス許可
アクセス許可を与えるは、/grant オプションを使います。
例えば、\\server\test に hodomain\user1 ユーザで"変更"の権限を加えるには以下のようにします。

icacls \\server\test /grant hodomain\user1:(OI)(CI)M

(OI)(CI)は継承をするという設定です。これを付けないと指定したフォルダのみにアクセス権が付与され、そのフォルダ配下は変更されません。

アクセス拒否
アクセス拒否の場合は、/deny オプションを使います。
以下の例は、user1の削除アクセス権を拒否する設定です。

icacls \\server\test /grant hodomain\user1:(OI)(CI)D


ACL削除
設定されたアクセス権を削除する場合は、/remove オプションを使います。

icacls \\server\test /remove hodomain\user1



アクセス許可マスク
一般的というか単純な権限のアクセス許可マスクは以下のようになります。

N - アクセス権なし
F - フル アクセス権
M - 変更アクセス権
RX - 読み取りと実行のアクセス権
R - 読み取り専用アクセス権
W - 書き込み専用アクセス権
D - 削除アクセス権


次は特殊なアクセス許可の指定ですが、以下のアクセス許可マスクが利用できるようです。
カッコ内に書き、複数指定する場合は、カンマ区切りになるようです。

DE - 削除
RC - 読み取り制御
WDAC - DAC の書き込み
WO - 所有者の書き込み
S - 同期
AS - システム セキュリティへのアクセス
MA - 無制限
GR - 一般的な読み取り
GW - 一般的な書き込み
GE - 一般的な実行
GA - 一般的なすべての操作
RD - データ読み取り/ディレクトリの一覧表示
WD - データ書き込み/ファイルの追加
AD - データの追加/サブディレクトリの追加
REA - 拡張属性の読み取り
WEA - 拡張属性の書き込み
X - 実行/スキャン
DC - 子の削除
RA - 属性の読み取り
WA - 属性の書き込み


例えば、あるフォルダの "データ読み取り/ディレクトリの一覧表示" と "削除" のみを許可する権限を付け、配下のフォルダにも継承させる場合は以下のようにします。

icacls \\server\test /grant hodomain\user1:(OI)(CI)(RD,DE)



継承
普通、フォルダは親フォルダのアクセス権を継承されています。
なので、トップフォルダがEveryoneのアクセス許可があって、配下のフォルダは特定のアカウントしかアクセスさせないようにするには、ACLを変更する前に継承を無効にしないといけません。
その為の設定が、/inheritance です。(なぜかWindowsServer2003版のicaclsではヘルプに無いですが、利用は出来ます)

例えば親フォルダの継承を解除し、親から設定されたアクセス権を削除するには以下のようにします。

icacls C:\test /inheritance:r

また、親フォルダの継承を解除し、親から設定されたアクセス権をコピーするには以下のようにします。

icacls C:\test /inheritance:d

eを指定すると継承が有効になります。

また、上述したとおり、/grant や /deny でACL編集する場合、(OI)(CI) を指定しないと、継承が有効にならないため、サブフォルダに適用されません。


ACLの表示、保存、復元
ACLの一覧表示は、パスを指定するだけでOKです。


icacls \\server\test /t
\\server\test HOGEDOMAIN\alluser:(RX)
HOGEDOMAIN\administrator:(I)(OI)(CI)(F)

\\server\test1 HOGEDOMAIN\user01:(OI)(CI)(M)
HOGEDOMAIN\administrator:(OI)(CI)(F)
HOGEDOMAIN\devlop:(OI)(CI)(F)

\\server\test2 HOGEDOMAIN\administrator:(I)(OI)(CI)(F)
HOGEDOMAIN\devlop:(I)(OI)(CI)(F)

/t オプションを指定すると、サブフォルダ,ファイルも再帰的に表示してくれます。
/save オプションをつけると、ファイルに保存ができます。(ただ保存されたファイルは、SDDL形式で保存されるため編集には不向きかもしれません)
/saveで保存したACLは /restore オプションで復元ができます。

icacls \\server\test /restore e:\acl.txt



ACLのバックアップ、復元ができるのは非常に運用面から言うとありがたいですね。


参考:
ICACLSを使ってアクセス権限をコマンドラインで変更する方法 - http://pnpk.net
@IT:icaclsコマンドでファイルのアクセス制御リストACLを保存/復元する
@IT:ファイルやフォルダのアクセス権をリセットして親フォルダから継承させる
[PR]
# by jehoshaphat | 2014-01-29 23:55 | 豆知識 | Trackback | Comments(0)
xcaclsが使えないため、icaclsをXPで動かすようにした

EMCのストレージサーバVNXeでCIFSの共有フォルダサーバを構築しました。
VNXeはActiveDirectory環境が構築されていれば、共有フォルダ上のファイルやフォルダのアクセス権がNTFSボリュームのよう自由自在にできるのが素晴らしいです。
(Linuxを使ってる某サプライメーカーのNASはトップレベルの共有フォルダしかアクセス権設定出来なかったもんで。。。)

で、VNXeで千個近くのフォルダのアクセス権の設定をGUIからやってると日が暮れるので、自動でやってしまおうと思いました。(クライアントの環境はXPです)
一般的なアクセス権はcacls.exe を使ってACL(NTFSアクセス権)を設定するでも書いたように、caclsコマンドが使えます。
また、caclsで設定できない特殊なアクセス権もxcacls.vbsを使って詳細なACL(NTFSアクセス権)を変更するで紹介した xcacls.vbs を使おうとしたのですが、実行すると以下のエラーになりました。

Error -2147023174: occurred in connecting to server. (Msg#3203)
Error description: RPC サーバーを利用できません。


xcacls.vbsは接続先のサーバのWMIをRPCで操作してACLを設定してるわけなので、WindowsOSではないVNXeに対して実行するとエラーになるのも当然ですね。

で、WindowsServer2003(SP2以降),WindowsVistaから付属してる icacls というコマンドなら、RPC使わずに特殊なアクセス権も設定できるということで試そうかと思いました。

しかし、共有フォルダの運用管理しているPCのOSは XP(x86) です。
試しに、Windows7 の端末から icscls.exe (system32配下にあります)を抜いて来ましたが、XP上では動きませんでした。

今度は、WindowsServer2003 SP2(x86) から icscls.exe を抜くと動きそうな感じですが、以下のように表示がうまくされません。

D:\>icacls

ICACLS <



@IT:icaclsコマンドでファイルのアクセス制御リストACLを保存/復元するによると、これはヘルプが上手く表示されないだけで機能的には正しく動作するようです。
しかし、ヘルプが見れないと不便なので、パッチを当てることにしました。
パッチはWindowsServer2003側で適用しないといけません。(再起動は必要有りませんでした)
パッチはMSサポート:>Windows Server 2003 SP2 を実行しているコンピューター上のファイルまたはフォルダーの所有権を設定する Icacls.exe ユーティリティを実行するとエラー メッセージ: アクセスが拒否されました"Windows Server 2003 SP2 を実行しているコンピューター上のファイルまたはフォルダーの所有権を設定する Icacls.exe ユーティリティを実行するとエラー メッセージ: アクセスが拒否されました"から入手可能です。

パッチ適用前と後では icacls.exe のファイル情報は以下のように変わります。

・適用前
バージョン: 5.2.3790.3959
ファイルサイズ: 35,840 バイト
  ↓
・適用後
バージョン: 5.2.3790.4243
ファイルサイズ: 36,352 バイト

これで、パッチ適用後のサーバから iecacls.exe を抜いてXPで動かすと問題なく実行できました。
[PR]
# by jehoshaphat | 2014-01-28 23:49 | 豆知識 | Trackback | Comments(0)
Symantec Backup Exec System Recovery 7.0でバックアップができなくなった
Symantec Backup Exec System Recovery 7.0(7.0.5.29755) を WindowsServer2003 R2(x86) に入れているんですが、バックアップができていないことに気付きました。
ユーザがログオンするたびに、タスクトレイ付近にバルーンが表示され今すぐバックアップするかみたいなことを聞いてきたので、バックアップをかけたんですが、なぜか94%で止まってしまいます。

Backup Execのイベントログを見ると以下のようになってました。

情報6C8F17E7: 同じジョブの以前のリカバリポイントが処理中のため、自動リカバリポイントは作成されませんでした。
詳細: 操作は中断されました


で、原因と対処法をググったところ、コンピュータ系サラリーマンブログ: BESR エラーEBAB03F1: 操作は中断されました. 0x80004004に解決策がありました。

手順としては参考先そのままですが、以下のとおりです。(バックアップジョブがクリアされるので設定等を別途メモっておくと良いです)

1.タスクマネージャーから、vprotray.exe を Kill。
2.Windowsのサービスから、Backup Exec System Recovery サービスを停止。
3.C:\Documents and Settings\All Users\Application Data\Symantec\Backup Exec System Recovery\Schedule 以下の PQJ ファイルを別のところに退避。
4.C:\Documents and Settings\All Users\Application Data\Symantec\Backup Exec System Recovery\History 以下の PQH ファイルを別のところに退避。
5.Backup Exec System Recovery サービスを再開。
6.コンソールからバックアップジョブを実行し、エラーが出なくなった確認。


上記の手順でやればよーやくまともにバックアップが走るようになりました。
やれやれです。
[PR]
# by jehoshaphat | 2014-01-27 23:48 | ツール | Trackback | Comments(0)
(.NET)ClickOnceで発行後にアプリを起動すると「配置IDがサブスクリプションと一致しません」と怒られる
ClickOnceでアプリケーションを配置してるんですが、バグを修正し新バージョンを発行しなおしました。
それでクライアント側のショートカットからアプリケーションを起動しようとすると、更新チェック後にエラーが発生し起動できません。
(ちなみに、アプリケーションのショートカットからでなく、ブラウザから起動すると別物してインストールされてしまいます。何故かアプリケーション名に -1 が付きます)

エラーの詳細を見たところ内容は以下のような感じでした。

エラー
プラットフォームのバージョン情報
Windows : 6.1.7601.65536 (Win32NT)
Common Language Runtime : 4.0.30319.18408
System.Deployment.dll : 4.0.30319.18408 built by: FX451RTMGREL
clr.dll : 4.0.30319.18408 built by: FX451RTMGREL
dfdll.dll : 4.0.30319.18408 built by: FX451RTMGREL
dfshim.dll : 4.0.31106.0 (Main.031106-0000)

ソース
配置の URL: file:///C:/Users/hoge/AppData/Roaming/Microsoft/Windows/Start%20Menu/Programs/testapp/hogehogeapp.appref-ms%7C
サーバー: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
配置プロバイダの URL: http://xxx.xxx.xxx.xxx:/testapp/hogehogeapp.application

エラーの概要
以下はエラーの概要です。これらのエラーの詳細はログに一覧表示されています。
* C:\Users\hoge\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\testapp\hogehogeapp.appref-ms| のライセンス認証により例外が発生しました。 次の失敗メッセージが検出されました:
+ 配置 ID がサブスクリプションと一致しません。

コンポーネント ストア トランザクションの失敗の概要
トランザクション エラーは検出されませんでした。

警告
この操作中に警告は発生しませんでした。

操作の進行状況
* [2014/01/24 16:33:32] : C:\Users\hoge\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\testapp\hogehogeapp.appref-ms| のライセンス認証が開始されました。
* [2014/01/24 16:33:32] : 配置で指定されたように必要な更新チェックを実行しています。

エラーの詳細
この操作中に次のエラーが検出されました。
* [2014/01/24 16:33:32] System.Deployment.Application.DeploymentException (SubscriptionState)
- 配置 ID がサブスクリプションと一致しません。
- ソース: System.Deployment
- スタック トレース:
場所 System.Deployment.Application.SubscriptionStore.CheckUpdateInManifest(SubscriptionState subState, Uri updateCodebaseUri, AssemblyManifest deployment, Version currentVersion, Boolean& bUpdateInPKTGroup)
場所 System.Deployment.Application.ApplicationActivator.PerformDeploymentUpdate(SubscriptionState& subState, String& errorPageUrl)
場所 System.Deployment.Application.ApplicationActivator.ProcessOrFollowShortcut(String shortcutFile, String& errorPageUrl, TempFile& deployFile)
場所 System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
場所 System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

コンポーネント ストア トランザクションの詳細
トランザクション情報はありません。


エラーは「ライセンス認証により例外が発生しました」となり、原因が「配置 ID がサブスクリプションと一致しません。」となっています。

ClickOnce用にしている証明書が変更されたりすると、別アプリと認識され、このようなエラーが出ることは知っていましたが、今回は証明書は変更してません。

いろいろ調べてみるとMSDN:.NET Framework 2.0 ベースのアプリケーションでClickOnce の証明書を変更すると別のアプリケーションとして認識されるに気になる記述が。。。


.NET Framework 2.0 は以下の 4 つの項目を基に ClickOnce アプリケーションの一意性を識別します。.NET Framework は 各項目の 1 つでも異なる場合には別アプリケーションとして識別し、新規インストールを実施します。

アプリケーション名 <name>
公開キー トークン <publicKeyToken>
カルチャ <language>
プロセッサアーキテクチャ (x86 など) <processorArchitecture>

(.NET Framework 2.0 SP1 が当たっていると、アプリケーション名、カルチャ、プロセッサアーキテクチャの項目でアプリケーションを識別するようです。)

ここでピンと来たのがプロセッサアーキテクチャです。
そういえば、ビルドがうまくいかくて、VisutalStudio でプロセッサアーキテクチャを "x86" から "ANY CPU" に変えてました。

この問題のアプリケーションのクライアント側のClickOnceのショートカットをテキストエディタで見てみると、以下のようになっていました。

http://xxx.xxx.xxx.xxx:/testapp/hogehogeapp.application, Culture=neutral, PublicKeyToken=4fdc3b94a306e3c2, processorArchitecture=x86

確かにまともに動いていた時はプロセッサアーキテクチャはx86だったようです。

VS側で "ANY CPU" を "x86" に戻してビルドしなおし発行したところ、今度はエラーが出ず最新版に置き換わりました。

まったくヤレヤレです。
ClickOnceは確かに手軽にクライアントへの展開ができるから便利なんですが、アップデート絡みになるといろいろかゆいところに手が届かず困ります。
そもそも証明書なしでも展開できるような仕組みにして欲しかったです。(例えばクライアントが自身とClickOnce発行サーバのIP確認して同じサブネットなら証明書なしでも起動できるとか。。。)
[PR]
# by jehoshaphat | 2014-01-26 23:46 | .Net開発 | Trackback | Comments(0)
(Linux)VMware Player5.0でネットワークのブリッジ先NICを指定したい
Fedora18の環境に VMware Player5.0を入れています。この端末はNICが二つあり、それぞれセグメントが異なります。

VMware Player上の仮想マシンで仮想NICをブリッジモードにしたいのですが、どちらの物理NICに接続するかの設定がありません。

でぐぐってみると、以下のコマンドからGUIでネットワークの設定ができるようです。

# /usr/lib/vmware/bin/vmware-netcfg


デフォルトだと以下のような画面が立ち上がってきます。
e0091163_4434865.jpg


vmnet0がブリッジになっていますが、どのNICにつなぐかというところが Automatic になっています。

このブリッジ先を明示的に指定してやればOKです。もう片方のNICにブリッジするために、Add Network で新しい vmnet を作成し、そこにもう片方のNICを指定します。
以下の例だと、vmnet0 は em1 、vmnet2 は p6p1 のネットワークインターフェースを使うようになります。
e0091163_4435585.jpg


後は、仮想マシン側の設定です。
仮想マシンの設定ファイル(.vmxファイル)のネットワーク設定を以下のようにします。

ethernet0.connectionType = "custom"
ethernet0.vnet = "VMnet2"


設定ファイルを保存後、GUIで仮想マシンの設定画面を開くと以下のように vmware-netcfg で定義されている VMnet を選べるようになります。
e0091163_444333.jpg


参考:
れぶろぐ - [VMware] VMware Player で vmnet2 などのカスタムネットワークを使う方法
vmware-netcfg とゲストOSのフルバックアップ - labunix の ラボゆにっくす
VMWare Player のゲスト OS からどうしてもブリッジで接続できない場合の対処 - suer のブログ (Windows版でVM4.0以前はインストーラを解凍してvmnetcfg.exeを起動すればいいようです。)
[PR]
# by jehoshaphat | 2014-01-26 06:43 | 仮想化 | Trackback | Comments(0)