Windowsのファイル共有に関して、コマンドで自動化するための情報を備忘として残しておきます!
NTFSのアクセス権限の操作
いきなりファイル共有関係無さそうな内容ですが、ファイル共有をする場合のアクセス権限はファイル共有の権限とNTFSのアクセス権限の組み合わせになるので、必須の設定になります。
アクセス権限を付与する場合は以下のような感じ
$ icacls {file path} /grant {username}:F
$ icacls {folder path} /grant {username}:(OI)(CI)F
後ろの権限を表すパラメータFはフルコントロール、(OI), (CI)は”このフォルダー、サブフォルダーおよびファイルに対して権限付与”という意味です。詳細はこちらを参照↓
権限を削除したい場合は以下のコマンドで
$ icacls {file or folder path} /remove {username}
ファイル共有の作成
この設定をしておかないとSMB/CIFS経由でアクセスできません。
$ net share {share name}={folder path} /grant:{username},{"full" or "change" or "read"}
全ユーザに対して共有するのであればusernameにeveryoneを設定すればOK。
ユーザ管理のコマンド
ユーザ作成
$ net user {username} {password} /add /fullname:"{full name}"
グループ作成
$ net localgroup {group name} /add
グループにユーザを追加
$ net localgroup {group name} {username} /add
コマンドでファイル共有にログイン
ファイル共有に対して任意のユーザでログインして、アクセス権限が適切かどうかを確認することができます。以下のコマンドでログインします。
$ net use \\{computer name}\{share name} /user:{username} {password}
ログアウトはこちら
$ net use \\{computer name}\{share name} /delete
ログアウトしてもsessionが切れない場合はファイル共有サーバ上で、コントロールパネル>管理ツール>コンピュータの管理から共有フォルダー>セッションを選択して、対象のセッションを切断すれば良いです。
ファイル権限テストの自動化
今までの「ログイン」「ログアウト」とファイル権限テストのメソッドを組み合わせることで、ファイル権限のテスト自動化ができます。Pythonで権限確認を行うプログラムを書くとこんな感じになります。
import subprocess
import os
user = "{username}"
password = "{password}"
share_name = "\\\\{computer name}\\{share name}"
subprocess.call("net use " + share_name + " /delete", stdout=subprocess.PIPE, shell=True)
subprocess.call("net use " + share_name + " /user:" + user + " " + password, stdout=subprocess.PIPE, shell=True)
try:
f = open(share_name + "\\{file path}", "r")
f.close()
except IOError:
print("No Read Permission")
try:
f = open(share_name + "\\{file path}", "w")
f.close()
except IOError:
print("No Write Permission")
if not os.access(share_name + "\\{folder path}", os.R_OK):
print("No Read Permission for Folder")
本当はos.accessで詳細を確認したかったんですが、pythonでNTFSの権限をos.accessで調べれないようだったので直接のファイル読み込み+エラーハンドリングでやっています。ディレクトリは書き込み権限が無くてもos.W_OKの結果がTrueだったり、正確な権限を確認できませんが、読み込み以上の権限があるかどうかはos.accessで確認できそうです。調べてませんが、.NETとかだったらNTFSの親和性高そうな気がするので、アクセス権限確認の自動化プログラムがもうちょい楽に確実に書けるのかもしれないです。
ファイル共有時の注意点
ファイル共有上でファイル、フォルダ削除するとゴミ箱に行かずに完全に消えます。ミスオペによる障害を解消するには、シャドウコピーをとって世代管理するか、定期的なフルバックを行うようにします。詳細は以下参照。
ユーザ名とパスワードがファイル共有サーバとアクセス元で異なる場合は、ログインプロンプトが表示されます。そのため、ファイル共有サーバへのシームレスなアクセスをしたい場合は、ユーザ名とパスワードを同じにしておけばOKです。 アクセスできないときはファイル共有とアクセス権限が適切かどうか、クレデンシャルが正しいかどうかを確認します。ユーザ名はwhoamiやecho %USERNAME%で確認可能です。