雑記+備忘録

OS中心の技術情報と趣味について(最近は主に将棋)。備忘録なのでここに書かれたことを試すのは自己責任でお願いします。

PowerShellで共有フォルダ作成、アクセス権設定(後編)

フォルダを作成、共有フォルダにし、NTFSアクセス権で初期状態で付与されている「Users」に対する権限を削除、 適切なドメイングループに「更新」の権限を与える

の、適切なドメイングループに「更新」の権限を与える部分です。

<後半 適切なドメイングループに「更新」の権限を与える>

##### 変数
# 対象フォルダパス
$nW_path = "C:\share3"

# 権限対象ユーザーもしくはグループ
$strUorG = "HOGE\Group01"

# 権限種別
$objFSR = [System.Security.AccessControl.FileSystemRights]::Modify

# 子フォルダや子オブジェクトへの継承
$objIF = ([System.Security.AccessControl.InheritanceFlags]::ObjectInherit `
   -bor [System.Security.AccessControl.InheritanceFlags]::ContainerInherit)

# 継承の別要素
$objPF = [System.Security.AccessControl.PropagationFlags]::None

# 許可もしくは拒否
$objACT = [System.Security.AccessControl.AccessControlType]::Allow


# 権限オブジェクトの生成
$objPM = ($strUorG, $objFSR, $objIF, $objPF, $objACT)

$objAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $objPM


# 現在のフォルダアクセス権を取得
$objACL = Get-Acl $nW_path

# 権限オブジェクトをフォルダアクセス権オブジェクトへセット
$objACL.SetAccessRule($objAccessRule)

# 変更されたフォルダアクセス権オブジェクトを実フォルダへセット
$objACL | Set-Acl $nW_path


5. 「更新」の権限付与
幹となる枠組みとしては、
 (1) 権限対象ユーザーもしくはグループ
 (2) 権限種別
 (3) 子フォルダや子オブジェクトへの継承
 (4) 継承の別要素
 (5) 許可もしくは拒否
の5個の要素(引数)を持つ権限オブジェクトを
フォルダアクセス権オブジェクトへセットし、
実フォルダへ反映させる、となります。

(1)についてはユーザーもしくはグループを文字列の型で指定すればよいですが、
(2)~(5)はそれぞれ適切な型のオブジェクトとして指定する必要があります。

参考URL(ありがとうございます)
PowerShellでファイルやフォルダのアクセス権を設定する - YOMON8.NET

(2)権限種別
「System.Security.AccessControl.FileSystemRights」型です。
「Modify」はGUIで設定する「更新」の権限にあたります。
他の一覧については以下の記事にまとまっています。(ありがとうございます)
Windows ACE の AccessMask(マスク)ビットフラグの対応関係 - Qiita
内部ではビット列のようなので、ビット和(-bor)等をうまく使って複数の権限を組み合わせられます。
上記記事の内容ですが、以下に引用します。

ListDirectory                  :        1  =                      1  =  0x00000001  ~  2^ 0
ReadData                       :        1  =                      1  =  0x00000001  ~  2^ 0
WriteData                      :        2  =                     10  =  0x00000002  ~  2^ 1
CreateFiles                    :        2  =                     10  =  0x00000002  ~  2^ 1
CreateDirectories              :        4  =                    100  =  0x00000004  ~  2^ 2
AppendData                     :        4  =                    100  =  0x00000004  ~  2^ 2
ReadExtendedAttributes         :        8  =                   1000  =  0x00000008  ~  2^ 3
WriteExtendedAttributes        :       16  =                  10000  =  0x00000010  ~  2^ 4
Traverse                       :       32  =                 100000  =  0x00000020  ~  2^ 5
ExecuteFile                    :       32  =                 100000  =  0x00000020  ~  2^ 5
DeleteSubdirectoriesAndFiles   :       64  =                1000000  =  0x00000040  ~  2^ 6
ReadAttributes                 :      128  =               10000000  =  0x00000080  ~  2^ 7
WriteAttributes                :      256  =              100000000  =  0x00000100  ~  2^ 8
Write                          :      278  =              100010110  =  0x00000116  ~  2^ 8
Delete                         :    65536  =      10000000000000000  =  0x00010000  ~  2^16
ReadPermissions                :   131072  =     100000000000000000  =  0x00020000  ~  2^17
Read                           :   131209  =     100000000010001001  =  0x00020089  ~  2^17
ReadAndExecute                 :   131241  =     100000000010101001  =  0x000200A9  ~  2^17
Modify                         :   197055  =     110000000110111111  =  0x000301BF  ~  2^17
ChangePermissions              :   262144  =    1000000000000000000  =  0x00040000  ~  2^18
TakeOwnership                  :   524288  =   10000000000000000000  =  0x00080000  ~  2^19
Synchronize                    :  1048576  =  100000000000000000000  =  0x00100000  ~  2^20
FullControl                    :  2032127  =  111110000000111111111  =  0x001F01FF  ~  2^20

「System.Security.AccessControl.FileSystemRights」型の詳細な説明記事です。
FileSystemRights 列挙型 (System.Security.AccessControl)

(3) 子フォルダや子オブジェクトへの継承
「System.Security.AccessControl.InheritanceFlags」型です。
GUIで一般的な「このフォルダー、サブフォルダーおよびファイル」を実現するには
「ObjectInherit」と「ContainerInherit」を「-bor」でビット和にする必要があります。
「System.Security.AccessControl.InheritanceFlags」型の詳細な説明記事です。
InheritanceFlags 列挙型 (System.Security.AccessControl)

(4) 継承の別要素
「System.Security.AccessControl.PropagationFlags」型です。
(3)で継承を行ったときに必要な要素です。今一つ「None」でOKなロジックを理解できていません。
「System.Security.AccessControl.InheritanceFlags」型の詳細な説明記事です。
PropagationFlags 列挙型 (System.Security.AccessControl)

(5) 許可もしくは拒否
「System.Security.AccessControl.AccessControlType」型です。
これは簡単、アクセス権の「許可」もしくは「拒否」です。
「System.Security.AccessControl.AccessControlType」型の詳細な説明記事です。
AccessControlType 列挙型 (System.Security.AccessControl)


以上です。この5個でワンセットとなり、
複数のグループやユーザーを割り当てる場合は、1つずつセットを作成、
割り当てていきます。

PowerShellで共有フォルダ作成、アクセス権設定(前編)

フォルダを作成、共有フォルダにし、NTFSアクセス権で初期状態で付与されている「Users」に対する権限を削除、 適切なドメイングループに「更新」の権限を与える

これをPowerShellでやりたいと思って調べると、方々にある情報を集めないといけないと分かったので、 備忘録っぽく集めておきます。
しかし覚えにくいし複雑。GUIのほうが楽な(と感じられる)設定の一つです。

まずはサンプルスクリプトを載せます。
<前半 共有フォルダ作成から「Users」権限の削除まで>

##### 変数
# 対象フォルダパス
$nW_path = "C:\share3"
# 共有名
$nW_Name = "share3"

##### 処理
# フォルダ作成
New-Item $nW_path -ItemType Directory

# フォルダ共有(共有アクセス権付与も)
New-SmbShare -Name $nW_Name -Path $nW_path -FullAccess Everyone

# 現在のフォルダアクセス権を取得
$objACL = Get-Acl $nW_path

# アクセス権の継承を解除
$objACL.SetAccessRuleProtection($true,$true)

# 変更されたフォルダアクセス権オブジェクトを実フォルダへセット
$objACL | Set-Acl $nW_path

# 現在のフォルダアクセス権を取得
$objACL = Get-Acl $nW_path

# 削除するアクセス権の選択
$objRemoveACL = ($objACL | Select -ExpandProperty Access | Where-Object {$_.IdentityReference -eq "BUILTIN\Users"})

# 複数あるので1つずつ削除を実行
foreach ($wACL1 in $objRemoveACL) {

  # 削除
  $objACL.RemoveAccessRule($wACL1)

}

# 変更されたフォルダアクセス権オブジェクトを実フォルダへセット
$objACL | Set-Acl $nW_path


段階ごとに解説していきます。

1. フォルダ作成
「New-Item」コマンドレットでフォルダを作成します。
「-ItemType Directory」がフォルダを作成するオプションです。


2. フォルダ共有

New-SmbShare フォルダ共有のコマンドレット
-Name <共有名> 共有名を指定するオプション
-Path <ファイルパス> ファイルパスを指定するオプション
-FullAccess <アクセス権対象UorG> フルコントロールを与えるオプション

「-FullAccess」のところを -ReadAccess で 読み取り許可 を、-ChangeAccess で 変更許可 を付与できます。

参考URLは以下です。(ありがとうございます)
PowerShell で共有フォルダーの作成 | blog.yottun8.com
PowerShell で smb コマンドレットで 共有 フォルダを作成する - tech.guitarrapc.cóm


3. アクセス権の上位からの継承を解除
上位からの継承があると「Users」を削除できないので継承を解除します。
「Get-Acl」で現在のフォルダアクセス権をオブジェクトとして取得、
オブジェクトのメソッド「.SetAccessRuleProtection」で継承を設定します。
設定後、「Set-Acl」で設定したアクセス権オブジェクトを実フォルダへ反映させます。
「.SetAccessRuleProtection」の2つの引数は以下の意味があります。

1番目:isProtected
このオブジェクトに関連付けられたアクセス規則を継承から保護する(=継承を無効にする)場合は true。
継承を許可する(=継承を有効にする)場合は false。

2番目:preserveInheritance
継承されたアクセス規則を保持する場合は true。
継承されたアクセス規則を削除する場合は false。
isProtected が false の場合、このパラメーターは無視されます。

参考URLは以下です。(ありがとうございます)
Powershellでフォルダやファイルのアクセス権を設定する | いろんなサーバー設定研究所
ObjectSecurity.SetAccessRuleProtection メソッド (Boolean, Boolean) (System.Security.AccessControl)


4. 「Users」へのアクセス権の削除
「Get-Acl」で現在のフォルダアクセス権をオブジェクトとして取得、
「Select-Object」の「-ExpandProperty」オプションを使用して、「Access」要素を展開しています。
「-ExpandProperty」についてはこちら
オブジェクト型変数の値について

Select-Objectはパラメータ名を指定しないと-Propertyパラメータが指定されたとみなされ、 先述のような動作をしますが、明示的に-ExpandPropertyパラメータを指定することで 「指定プロパティの値を展開したオブジェクト」を出力するようにもできます。

さらに「Where-Object」でグループ名「BUILTIN\Users」で抽出しています。

展開、抽出した値は、一つずつ削除の対象とするために「foreach」で読み込みます。
そして、オブジェクトのメソッド「.RemoveAccessRule」で権限を削除します。
設定後、「Set-Acl」で設定したアクセス権オブジェクトを実フォルダへ反映させます。

参考URLは以下です。(ありがとうございます。「素敵なおひげ」さんには毎度お世話になっております。)
Windows - PowerShellでフォルダのACLユーザを削除したい(119322)|teratail


(後編へ続く)

Windows Server OS ベアメタルリカバリ時に使用するネットワーク関連コマンド

過去何度もやっていながら、久しぶりだと忘れてしまうのでメモです。

WSBのイメージ格納先がネットワーク共有フォルダの場合、
その共有フォルダのあるサーバー等とネットワーク通信を取る必要があります。
Windowsのメディアブート初期ではIPアドレスは割り振られておらず、
ネットワークサービスさえ立ち上がっていない場合があるので以下のコマンドを実行して
ネットワークをつなぎます。

まずはネットワークサービスの起動。(自動的に「wpinit」も起動されて初期化も行われます)

startnet


次に、現在有効なネットワークインターフェースの一覧表示。

netsh interface ipv4 show interfaces


上記一覧表示された中から、共有フォルダにアクセスするのに使えるインターフェースの名前をチェックし、 IPアドレスを割り振ります。
(下図の「イーサネット」がインターフェース名、「192.168.1.5」が割り振るIPアドレス

netsh interface ip set address "イーサネット" static 192.168.1.5 255.255.255.0


最後に、pingで共有フォルダのあるサーバーと通信が取れているか確認します。

ping 192.168.1.2


あとは「exit」でコマンドプロンプトを抜け、ウィザードに沿ってイメージからのベアメタルリカバリが行えます。

フォルダ作成削除リネームなど

基本ながら忘れるのでメモ。

○ フォルダー作成

New-Item C:\Work\Folder -ItemType Directory


○ フォルダーリネーム(ファイルも同じ)

Rename-Item C:\Work\Folder Folder2


○ フォルダー削除(ファイルも同じ)

Remove-Item C:\Work\Folder2 -Force -Recurse

-Force 隠しファイルや読み取り専用ファイルなども削除
-Recurse 配下のサブフォルダも再帰的に削除

○ フォルダー存在確認

if (Test-Path C:\Work\Folder2) {
  echo "フォルダあります"
}


○ ついでにForループとWhileループのひな型も

for ($i = 0; $i -lt 10; $i++) {
  # 0~9が画面出力
  Write-Output ("count:"+$i)
}


$cnt = 0
while ($cnt -lt 10) {
  # 0~9が画面出力
  Write-Output ("count:"+$cnt)
  $cnt++
}

フォルダの所有権を得て全削除

半年ほど前の記事の発展版。
 管理者ユーザーで、特定ユーザーのプロファイルフォルダを全削除したい
目的で、フォルダの所有権とフルコントロール権限を得るコマンドです。

まずは以前のエントリの繰り返しですが、所有権を得るコマンド

takeown /f "<フォルダのパス>" /r /d Y


オプションの意味は

/f <フォルダ名もしくはファイル名フルパス> ・・・ 対象となるフォルダ、ファイルの指定
/r ・・・ フォルダ内のすべてのサブフォルダ、ファイルを再帰的に実行
/d Y ・・・ 確認メッセージに対して「はい」を自動的に返してくれる


次にフルコントロールを得るコマンド

cacls <フォルダのパス>\* /T /G Administrator:F


オプションの意味は

/T ・・・ 現在のディレクトリとすべてのサブディレクトリにある指定されたファイルの ACL を変更
/G <ユーザー名>:<アクセス権>・・・ 指定されたユーザーにアクセス権を与える。Fはフルコントロール


参考にしたのはこのサイトです(ありがとうございます)。
https://www.uramiraikan.net/Works/entry-2889.html
上記サイトに注意書きがあります。覚えておこう。

上記のコマンドはどちらも配下のサブディレクトリ/ファイル全てに対して再帰的に実行されるが、
一度だけでの実行では変更されないものが残る場合がある。その場合は何度か繰り返して実行する
("はい/いいえ"の問い合わせは全て"はい"を選択)


これで削除できるようになります。

以下が以前の記事です。

第3期指す将順位戦展望

今さらな記事ですが、第3期指す将順位戦にエントリーし、
いよいよ明後日が開幕局です。
そこで、「開幕直前!」の勢いで展望について書きます。

一言でいえば、「ぶっちぎり降格候補、苦戦が予想される」です。
対局相手のRを調べました。
 1回戦: +662
 2回戦: +238
 3回戦: +361
 4回戦: +88
 5回戦: +670
 6回戦: +127
 7回戦: +382
 8回戦: +470
 9回戦: +64
 10回戦: +718
 11回戦: +645

全員自分よりも上、しかも差が400を超え、
先手固定とならないようにフリー対局をお願いしなくては、な方も多い。

まあ、格上の方と指せるチャンスと前向きにとらえて楽しみ、
あわよくば残留を狙っていきます。

前期は新規参加者で似たようなRの方が多かったのですが、
今期は新規参加者でB級2組に割り当てられた人たちのレベルが上がり、
さらにB級3組からも同じようなレベルの方が上がってきた結果と考察しています。

さあ、これらの本を読んで備えよう(棋力向上が必要な現状からの逃避)。

GIANT KILLING(47) (モーニング KC)

GIANT KILLING(47) (モーニング KC)

弱者が勝者になるために―ノムダス〈2〉

弱者が勝者になるために―ノムダス〈2〉

市川市将棋大会に見る、大会運営の急所

指す将順位戦でも話題になりましたが、
将棋大会の運営はやりがいがある一方で、一部の人に負荷がかかりがちですし、
引継ぎにも悩みます。


誰もが知っている「マグロ」に比べるとインパクトがないごくごく普通の大会ですが、
千葉県市川市にも市民大会があります。
その市川市将棋大会のちょっとつっこんだ話を紹介していただいております。
読んで感想などいただければありがたいです。
ツイッターでは既に紹介して、たくさんの反響をいただきました。ありがとうございます。)


私自身も他の件で経験があるのですが、引継ぎの話題になるのは大体こういった図式です。


 創始者、あるいは創設時運営メンバー(以下創設時運営と記載します)はアイデアもあり、
 情熱もあるので時間もかけてぐんぐん進めていく
  ↓
 軌道に乗り、参加者が増えていく(簡単にはやめられなくなる)
  ↓
 参加者が増えることによる創設時運営の負担増、
 あるいは運営メンバーの諸事情(仕事、家庭、健康など)から継続が難しくなる
  ↓
 誰かに運営を引き継ぎたい


そして以下の点で頭をひねることになります。
・創設時運営と同等の情熱、労力、時間をかけてくれる人がいるのか
・運営に慣れていない人に引き継ぐことで質が低下しないか
・創設時運営のパーソナリティや技術に依存した部分を引き継げるのか
・創設時運営の作り出す雰囲気が好きで参加した、という参加者が離れていかないか
・創設時運営だから従った、という参加者がルール無視のふるまいで大会を壊さないか


指す将順位戦では、創設時の主催者が「きつい、引き継ぎたい」ということをオープンにされ、
それに応じて何人もの方が手を挙げ、
その中で主催者も「この人なら」という方がみつかり、現在引継ぎを行ったところです。
上記ポイントのいくつかで問題が発生しないかは実際に1期こなしてみないと分からない面はありますが、
まずまず理想的な方向へ進んでいると思います。
私も大会の恩恵をこうむっている者としてできる限りの協力をして、
引継ぎがうまくいった、と言えるような結果を目指したいと思います。


仕事上の引継ぎとは異なり、趣味の大会運営やサークル運営については、
どうしても運営メンバーがかけられる時間、労力、情熱について、
上でも挙げた諸事情により波が出てきます。
「一番盛り上がっている人が、一番盛り上がっている期間だけ」
運営を担当して、それが下降線になったちょうどその時に盛り上がっている人へと
バトンタッチをしていけたら理想的です。
なかなかそううまくはいきませんが・・・。


冒頭に紹介した記事の内容とは必ずしも一致しませんが、
現時点で言えることとして、以下はポイントになりそうです。
・各世代の生活モデルが変化しているので、
 これまでの「順繰り」引継ぎや一部の人に権限とそれに伴う負担を集中させる運営は
 若い人の参入も鈍り、どこかで限界を迎える
・難しい点も多いが、スタッフを雇って組織化するなど、
 お金がからむ話に持っていくのが「長期的な継続」という観点ではよさそう
・運営側はきつくなってきたときにはその事実を大会参加者にオープンにし、
 何らかアイデアなり代わりにやってくれる人を求めたほうがよい
 (いろいろ宗教の勧誘や詐欺まがいの商法に大会を利用する人が現れる可能性を考えると、
  オープンの範囲や方法は考えどころでしょうが・・・)
・手を挙げてくれた人がいた場合は、その人が多少やり方を変えたとしても、
 引継ぎ元の人たちはおおらかに見守る精神が必要