Как проверить, есть ли у ресурса доступ на запись? - PullRequest
2 голосов
/ 16 марта 2012

У меня есть доступ с правом записи. Я пишу сценарий powershell для записи файла журнала в эту общую папку.

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

Как проверить доступ на запись / Полный контроль с помощью powershell?

Я пробовал использовать командлет Get-ACL.

 $Sharing= GEt-ACL "\\Myshare\foldername
    If ($Sharing.IsReadOnly) { "REadonly access" , you can't write" }

Он имеет свойство Isreadonly, но есть ли способ гарантировать, что пользователь имеет доступ к Fullcontrol?

Ответы [ 3 ]

7 голосов
/ 17 марта 2012

Это то же самое, что и @ Christian's C #, только без компиляции C #.

function Test-Write {
    [CmdletBinding()]
    param (
        [parameter()] [ValidateScript({[IO.Directory]::Exists($_.FullName)})]
        [IO.DirectoryInfo] $Path
    )
    try {
        $testPath = Join-Path $Path ([IO.Path]::GetRandomFileName())
        [IO.File]::Create($testPath, 1, 'DeleteOnClose') > $null
        # Or...
        <# New-Item -Path $testPath -ItemType File -ErrorAction Stop > $null #>
        return $true
    } catch {
        return $false
    } finally {
        Remove-Item $testPath -ErrorAction SilentlyContinue
    }
}
Test-Write '\\server\share'

Я хотел бы взглянуть на реализацию GetEffectiveRightsFromAcl в PowerShell, потому что это лучше ответит на вопрос ....

2 голосов
/ 16 марта 2012

Я использую этот способ, чтобы проверить, есть ли у текущего пользователя доступ на запись к пути:

# add this type in powershell

add-type @"
using System;
using System.IO;

public class CheckFolderAccess {

 public static string HasAccessToWrite(string path)
        {
            try
            {
                using  (FileStream fs = File.Create(Path.Combine(path, "Testing.txt"), 1, FileOptions.DeleteOnClose))
                { }
                return "Allowed";
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

}
"@

# use it in this way:

if ([checkfolderaccess]::HasAccessToWrite( "\\server\share" ) -eq "Allowed") { ..do this stuff } else { ..do this other stuff.. }

Код не проверяет ACL, но только если возможно записать файл в путь, если это возможно, возвращает строку «позволено», иначе возвращает ошибку сообщения об исключении.

1 голос
/ 07 августа 2014

Вот довольно простая функция, которую я построил. Возвращает «Чтение», «Запись», «Чтение и запись» и «» (без доступа):

function Test-Access()
{
    param([String]$Path)
    $guid = [System.Guid]::NewGuid()
    $d = dir $Path -ea SilentlyContinue -ev result
    if ($result.Count -eq 0){
        $access += "Read"
    }   
    Set-Content $Path\$guid -Value $null -ea SilentlyContinue -ev result
    if ($result.Count -eq 0){
        $access += "Write";
        Remove-Item -Force $Path\$guid
    }   
    $access
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...