Назад | Перейти на главную страницу

Повторно предоставьте пользователям право владения их подключенными домашними папками через PowerShell

Я изменил пользовательскую квоту на машине с Windows 2008, и после этого некоторые пользователи сообщили, что они могут читать, но не писать в свои подключенные домашние папки. Если я повторно введу путь к домашней папке в диспетчере сервера и приму приглашение по умолчанию ...

"The \\server\folder home folder already exists. Do you want this user to be granted full control on this folder?"

... проблема исчезает.

  1. Есть ли способ сделать то же самое с 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

Чтобы проверить право собственности на папку или файл, вы можете использовать метод 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
                   }
                }
        }

Поскольку вы настраиваете домашние папки в AD, почему бы просто не переназначить их с помощью ADUC и переменных?

Допустим, ваши папки названы вашими именами пользователей.

Вы можете отфильтровать представление, чтобы отображать только тех пользователей, у которых в настоящее время задано значение для их домашней папки.

Выберите всех пользователей, которых вы хотите обновить, и перейдите в Свойства этих пользователей, затем нажмите Profile таб.

Введите путь к домашней папке как таковой:

\\<servername>\Home Folders\%USERNAME%

а затем нажмите ОК. Он будет циклически перебирать и сбрасывать разрешения для каждой папки, используя их индивидуальные имена пользователей.

Вам нужно будет изменить путь, чтобы он соответствовал вашему пути, но важной частью является %USERNAME%.