Windows 2008マシンのユーザー割り当てを変更した後、一部のユーザーから、マップされたホームフォルダーの読み取りはできたが書き込みはできなかったと報告されました。サーバーマネージャーでホームフォルダーのパスを再入力し、デフォルトのプロンプトを受け入れると...
"The \\server\folder home folder already exists. Do you want this user to be granted full control on this folder?"
...問題は解消されます。
Powershellで同じことを行う方法はありますか?スクリプトは、ユーザーがアクセス許可を持っているかどうかを確認し、持っていない場合はそれらを再割り当てしますか?
完全なアクセス許可を持っていない人を特定するために、所有者と一緒にフォルダーのアクセス許可を一覧表示するのはどうですか?私はこの2番目の質問に数時間を費やし、結果はまちまちでした。
次のスクリプトは、権限が一致しないフォルダを一覧表示していないようです。
get-acl "D:\users\*" | select Path -Expand Access | where
{ $_.Identityreference -notcontains 'NT AUTHORITY\SYSTEM'
-and $_.Identityreference -notcontains 'CREATOR OWNER'
-and $_.Identityreference -notcontains 'BUILTIN\Administrators'
-and $_.Identityreference -notcontains 'BUILTIN\Users'
-and $_.Identityreference -notcontains 'BUILTIN\Account Operators'
-and $_.Identityreference -notcontains 'BUILTIN\BUILTIN\Users'} |
select @{Expression={$_.path};Label="Folder"},
@{Expression={$_.IdentityReference};Label="User"},
@{Expression={$_.AccessControlType};Label="Permissions"} |
Format-Table -Wrap -AutoSize
ADでホームフォルダを設定しているので、ADUCと変数を使用して再割り当てしてみませんか?
あなたのフォルダがあなたのユーザー名として名前が付けられているとしましょう
ビューをフィルタリングして、現在ホームフォルダに値が設定されているユーザーのみを表示できます。
更新するすべてのユーザーを選択し、それらのユーザーのプロパティに移動してから、[Profile
]タブに移動します。
ホームフォルダのパスを次のように入力します。
\\<servername>\Home Folders\%USERNAME%
そして大丈夫を打つ。個々のユーザー名を使用して、各フォルダーのアクセス許可を循環してリセットします。
パスに一致するようにパスを変更する必要がありますが、重要な部分は%USERNAME%
です。
フォルダまたはファイルの所有権を確認するには、GetOwnerメソッドを使用できます。
$acl = Get-Acl $dir.fullname
$acl.GetOwner([System.Security.Principal.NTAccount])
そして、新しい所有者を次のように設定します。
$objUser = New-Object System.Security.Principal.NTAccount("YourDomain", "YourUser")
$acl.SetOwner($objUser)
これは役立つかもしれません。しばらく前に採用した共有フォルダー構成のアクセス許可を修正する必要がありました。 powershellとsubinacl.exeを使用する(所有者をリモートで変更することはあまり機能しないため)。これはクリーンアップにも使用されたため、無効または削除されたユーザーアカウントフォルダーの名前を変更するための追加のコードがここにあります。これもQuestコマンドレットを使用する古いスクリプトであり、ネイティブADコマンドレットに置き換えることができます。
Add-PSSnapin quest*
$dirlist = gci \\server\share | ? { $_.PSIsContainer }
$subinacl = "C:\utils\subinacl.exe"
foreach ($userdir in $dirlist)
{
#the foldername was a funny format (citrix 2008 profile with .2k8 suffix)
$username = $userdir.name.Split('.')[0]
$adaccount = Get-QADUser $username
If (($adaccount.AccountIsDisabled -eq $TRUE) -or (!$adaccount))
{
write-Host "$username is not a current employee"
#rename folder to _DEL_originalname
$newname = "_DEL_$username"
rename-item -path $userdir -newname $newname
}
Else
{
#get full path
Write-Host "$userdir - changing permissions"
$currentDir = $userdir.FullName # this way you don't duplicate the start folder
#get ACL of folder
$acl = Get-Acl $currentDir
If ($acl.access -notcontains $username) {
#variable to set new permissions for username of folder
$permission = "domain\$username",”FullControl”,”ContainerInherit,ObjectInherit”,”None”,”Allow”
$accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission
#actually set the permissions
$acl.SetAccessRule($accessRule)
Set-Acl $currentDir $acl
#use subinacl to set owner at parent level and below
$params1 = "/file $currentDir /setowner=domain\$username"
$params2 = "/subdirectories $currentDir\*.* /setowner=domain\$username"
$params3 = "/subdirectories $currentDir\* /grant=domain\$username"
$params4 = "/subdirectories $currentDir\* /grant=domain\administrators=F"
Invoke-Expression "$subinacl $params1" | out-null
Invoke-Expression "$subinacl $params2" | out-null
Invoke-Expression "$subinacl $params3" | out-null
}
}
}