Нам требуется только добавлять текст в конец файла, поэтому вполне разумно будет ограничиться лишь разрешение Append Data (дозапись данных).
Для теста создадим файл и назначим требуемые права доступа:
#Создадим файл Set-Content -Path mydoc.txt -Value "Привет" #Установим право доступа текущему пользователю Append Data & Read $acl = Get-Acl mydoc.txt $acl.SetAccessRuleProtection($true,$false) $rule = New-Object Security.AccessControl.FileSystemAccessRule( $env:UserName,"Read,AppendData","Allow" ) $acl.AddAccessRule($rule) $acl | Set-Acl #Посмотрим,что получилось (Get-Acl mydoc.txt).Access FileSystemRights : AppendData, Read, Synchronize AccessControlType : Allow IdentityReference : PC\Kazun IsInherited : False InheritanceFlags : None PropagationFlags : None
Теперь попробуем добавить данные в конец файла:
- "Конец" >> mydoc.txt — Out-File : Отказано в доступе по пути "C:\mydoc.txt".
- "Конец" | Out-File -Append mydoc.txt — Out-File : Отказано в доступе по пути "C:\mydoc.txt".
- Add-Content mydoc.txt -Value "Конец" — Add-Content : Отказано в доступе по пути "C:\mydoc.txt".
- $file = [IO.File]::AppendText("mydoc.txt") — Исключение при вызове "AppendText" с "1" аргументами: "Отказано в доступе по пути "C:\mydoc.txt"."
- [IO.File]::AppendAllText("mydoc.txt","Конец") — Исключение при вызове "AppendAllText" с "2" аргументами: "Отказано в доступе по пути "C:\mydoc.txt"."
- $file = New-Object IO.FileStream("mydoc.txt", [IO.FileMode]::Append, [IO.FileAccess]::Write) — New-Object : Исключение при вызове ".ctor" с "3" аргументами: "Отказано в доступе по пути "C:\mydoc.txt"."
Все эти методы запрашивают более высокие разрешения (GENERIC_WRITE = 0x40000000) , нежели чем мы предоставили . Укажем более точные разрешения, для этого воспользуемся классом IO.FileStream.
#Текст, который мы добавим в конец файла $text = "`r`nКонец" #Преобразуем в массив байтов с кодировкой cp-1251 $TextBytes = [Text.Encoding]::GetEncoding("windows-1251").GetBytes($text) #Укажем требуемые разрешения $fs = New-Object IO.FileStream("mydoc.txt",[IO.FileMode]::Open,[Security.AccessControl.FileSystemRights]::AppendData,[IO.FileShare]::Read,8,[IO.FileOptions]::None) #Добавим данные $fs.Write($TextBytes,0,$TextBytes.Count) #Закроем текущий поток $fs.Close()
Код отработал без ошибок. Теперь посмотрим на наш результат:
PS С:\> Get-Content mydoc.txt Привет Конец
Более подробно с разрешениями NTFS,можете ознакомится:
Добавить комментарий