Главная > Powershell > Как узнать свои права на доступ к каталогу

Как узнать свои права на доступ к каталогу

Задали мне вопрос:

Как можно добавить проверку на то что нет прав на каталог?
А то при исполнении если нет прав – скрипт вываливается с ошибкой:
Get-ChildItem : Access to the path ‘N:\folder1′ is denied.
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

Ответ в двух словах не получился, поэтому развёрнутый ответ далее 🙂

Для того, чтобы узнать права на каталог есть специальный командлет Get-Acl. Если вызвать его без параметров, то он покажет права к текущему каталогу. Если нужно узнать права к какому-либо другому каталогу его нужно указать в параметре –Path (хотя имя параметра указывать необязательно).

Т.е. если есть какой-то каталог C:\Temp узнать все права на него для всех пользователей можно так:

$Path = 'C:\temp'
Get-Acl $Path

или так:

Get-Acl -Path $Path

Это одно и то же. Просто второй вариант более наглядный.

Однако в таком виде Powershell даст не совсем читаемый ответ. Поэтому если нас интересуют только права (а именно они в данном случае нам и нужны), лучше только их и вывести:

(Get-Acl $Path).access

В результате получим:

FileSystemRights     : Modify, ChangePermissions, TakeOwnership

AccessControlType  : Deny

IdentityReference    : TEST\serg

IsInherited              : False

InheritanceFlags     : ContainerInherit, ObjectInherit

PropagationFlags    : None

FileSystemRights     : FullControl

AccessControlType  : Allow

IdentityReference    : NT AUTHORITY\SYSTEM

IsInherited              : False

InheritanceFlags     : ContainerInherit, ObjectInherit

PropagationFlags    : None

Уже лучше 🙂

Если нужно узнать права конкретного пользователя, то нужно из этого вывода выбрать имя только того пользователя, который нас интересует, в формате ДОМЕН\Пользователь. И так как нас интересуют не сами права, а вообще есть-ли доступ, то нужно смотреть в поле AccessControlType.

Для пользователя, который в данный момент залогинен в системе это может выглядеть так:

$UserName = $Env:USERDOMAIN + '\'+ $Env:USERNAME
((Get-Acl $Path).access |
    Where-Object {$_.IdentityReference -eq $UserName}).AccessControlType

Исходя из всего вышесказанного узнать есть-ли доступ к каталогу у пользователя можно таким условием:

if (((Get-Acl $Path).access |
Where-Object {$_.IdentityReference -eq $UserName}).AccessControlType -eq 'Deny')
{
    Write-Warning "У тебя нет доступа к $Path"
}
Реклама
Рубрики:Powershell Метки:
  1. Комментариев нет.
  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: