質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

2842閲覧

ディレクトリのアクセス権限を取得、インポートするスクリプトについて

spline

総合スコア1

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2022/01/07 07:45

編集2022/01/07 07:46

前提・実現したいこと

PowerShell初心者です。
初めての質問であり、質問内のわかりづらい部分等、拙い記載がありましたら申し訳ございません。
PowerShellにて、ディレクトリのアクセス権限を取得するスクリプトおよび、取得したデータをインポートするシェルを作成中です。
具体的には正サーバからアクセス権限をcsvに出力し、災対用サーバにて、csvからデータを読み取り、
正サーバと同様の設定を行いたいと考えております。

疑問点

・csvからデータを読み取る為の書き方が理解できていません。
・csvに出力する際にキーに対して値が複数ある際に、キー,値,値となってしまいます。
実現したい出力は
キー,値
キー,値 となりますが、出力方法が分かりません。

該当のソースコード

■アクセス権出力用(dir-csv.ps1)
$target = "c:\temp"
foreach (FolderList in Get-ChildItem | where-object { $_.PSIsContainer })
{
$shareacl = (Get-ACL $FolderList).Access | Select IdentityReference | Select-String -Pattern 'domainname' | Select-String -Pattern 'user[0-9][0-9][0-9]'
Write-Host "FolderList","shareacl"
}

■csv出力用
$outfile = "c:\userlist.csv"

Powershell -NoProfile -File ".\dir-csv.ps1" > $outfile

#######出力後成型
$data = Get-Content $outfile | Foreach-Object { $_ -replace "{IdentityReference=","" }
$data | Out-File $outfile
$data = Get-Content $outfile | Foreach-Object { $_ -replace "}","" }
$data | Out-File $outfile
$data = Get-Content $outfile | Foreach-Object { $_ -replace " ","," }
$data | Out-File $outfile

試したこと

・csvからデータを読み取る方法
ヘッダーを付ける

$outfile = "c:\userlist.csv"
$target = "c:\temp"

$csv_content = Get-Content -Path "$outfile" -Encoding String
$csv_content = $csv_content | ConvertFromCsv -Header "dir","user1","user2"...

補足情報

具体的に実現したいことは以下です。

■csvを下記のようにしたい
test1,user001
test2,user001,user002

test1,user001
test2,user001
test2,user002

■csvからディレクトリ名、ユーザ名を抽出しアクセス権限をループして与える
$target = "c:\temp"

cd $target
$User_or_Group_name = 'ここにcsvから抽出したユーザ名を入れたい'
$Folder_Path = "ここにvsvから抽出したディレクトリ名を入れたい($target+抽出したディレクトリ名)"
$acl = Get-ACL $FolderPath
$Permission = ("$User_or_Group_name","FullControl","ContainerInherit","None","Allow")
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$acl.SetAccessRule($AccessRule)
$acl | Set-ACL $FolderPath

上記をループさせたい。

以上となります。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

csvからディレクトリ名、ユーザー名を抽出
キー,値,値,値,値,値,値,値,値,値,値,値,値,値,値,値

キー,値

PowerShell

1 2# 3# csvからディレクトリ名、ユーザー名を抽出 4# 5# ■注意事項■ 6# csvファイルは「ヘッダなし」にしてください。 7 8<# 9■使用したサンプルデータ 10test1,user001 11test2,user001,user002 12test3,user001,user002,user003,user004,user005,user006,user007,user008,user009,user010,user011,user012,user013,user014,user015 13test4,user001 14test5,user001,user002 15test6 16 17test7,user001 18test8,user001,user002 19 20■実行結果 21c:\temp\test1 user001 22c:\temp\test2 user001 23c:\temp\test2 user002 24c:\temp\test3 user001 25c:\temp\test3 user002 26c:\temp\test3 user003 27c:\temp\test3 user004 28c:\temp\test3 user005 29c:\temp\test3 user006 30c:\temp\test3 user007 31c:\temp\test3 user008 32c:\temp\test3 user009 33c:\temp\test3 user010 34c:\temp\test3 user011 35c:\temp\test3 user012 36c:\temp\test3 user013 37c:\temp\test3 user014 38c:\temp\test3 user015 39c:\temp\test4 user001 40c:\temp\test5 user001 41c:\temp\test5 user002 42c:\temp\test7 user001 43c:\temp\test8 user001 44c:\temp\test8 user002 45 46ご迷惑をお掛け致しまして、誠に申し訳ございませんでした。 47#> 48 49 50# 51# キー,値,値,値,値,値,値,値,値,値,値,値,値,値,値,値 を変更します。 52# ↓ 53# キー,値 54# 55 56 57$inputfile = "c:\userlist.csv" # ← Cドライブに「ヘッダなし」のcsvファイルを置きます。 58$aaaa = @() # 配列 59$Datas = @(Get-Content -LiteralPath $inputfile) # Datas ← 最後の s は気にしないで。 60foreach ( $Data in $Datas ){ 61 if ( $Data -ne '' ){ 62 $K_Count = ($Data.Split(",").count - 1) 63 if ( $K_Count -ne 0 ){ 64 for ( $N=0 ; $N -lt $K_Count ; $N++ ){ 65 [String]$D_Name = $Data.Split(",")[0] 66 [String]$U_Name = $Data.Split(",")[($N+1)] 67 [String]$Merge = $D_Name + "," + $U_Name 68 $aaaa += $Merge 69 } 70 } 71 } 72} 73 74 75# 76# キー,値 を分解します。 77# test1,user001 → user001 78# test1,user001 → test1 79# 80 81foreach ( $bbbb in $aaaa ){ 82 $target = "c:\temp" # c:\temp ターゲット 83 $Right = $bbbb.Split(",")[1] # user001 カンマを中心にして分解 test1,user001 → user001 右辺を取得 84 $Left = $bbbb.Split(",")[0] # test1 カンマを中心にして分解 test1,user001 → test1 左辺を取得 85 $User_or_Group_name = $Right # user001 ユーザー名 86 $Folder_Path = $target+ '\' + $Left # c:\temp\test1 target+ディレクトリ名 87 # ----- 88 89 Write-host $Folder_Path $User_or_Group_name # 確認の為、表示させています ← c:\temp\test1 user001 ← この内容で正しいかどうか確認してください。確認後は削除できます。 90 91 # ----- 92 # 93 # ↓ここから先は、自己責任になります。ご利用に際し如何なる損失や損害が発生しても、一切の責任を負いかねます。 94 # 95 # cd $target 96 # $acl = Get-ACL $Folder_Path # ファイル名を修正しました FolderPath → Folder_Path 97 # $Permission = ("$User_or_Group_name","FullControl","ContainerInherit","None","Allow") 98 # $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission 99 # $acl.SetAccessRule($AccessRule) 100 # $acl | Set-ACL $Folder_Path # ファイル名を修正しました FolderPath → Folder_Path 101}

投稿2022/01/11 04:25

ccc-

総合スコア356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私のミスで質問者様の文章を読み間違えました。
取消して撤回致します。
誠に申し訳ございませんでした。
心からお詫び申し上げます。

投稿2022/01/07 13:17

編集2022/01/11 07:27
ccc-

総合スコア356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/01/07 14:10

> $out = $Data -replace '^(.*),(.*),(.*)$','$1,$2' これ試しましたか? 低評価しておきます。
spline

2022/01/11 02:24

ccc- 様 お返事が遅れて申し訳ありません。 非常に丁寧なご回答ありがとうございます。 本日サーバにて確認したところ、要件に沿った出力にできたのですが、 値が2つないディレクトリには同一ユーザが2つ表示されてしまいます。 また、値が3個以上の場合、何かいい方法はありませんでしょうか。 ディレクトリによりユーザ数が異なりますが、最大で15ユーザほど登録されているディレクトリが存在します。 聞いてばかりで申し訳ありませんが、よろしくお願いいたします。
Zuishin

2022/01/11 02:26

私が書いたところに原因があります。
spline

2022/01/11 02:55

Zuishin 様 私がプログラミングについて無知すぎるあまり、お目汚しして申し訳ありません。 ccc- 様の回答を拝見しながら理解を進めようとしているのですが、時間がかかってしまい… 色々と購入した参考書等とも見合わせているのですが、理解が及んでいません。 どうか、温かく見守っていただけると幸甚です。
ccc-

2022/01/11 04:27

ご迷惑をお掛け致しまして、誠に申し訳ございませんでした。 もう1つアップします。 複数の値に対応致しました。 お手数ですが、ご確認ください。
spline

2022/01/11 05:11

ccc- 様 早急なご対応ありがとうございます。 また、動作正常確認できました。 こんなに良いものを作っていただきなんとお礼したらいいか… 後学の為に、中身も勉強させていただきます。 この度はお力添えいただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問