0

Я создаю сценарий развертывания веб-приложений в PowerShell, и для одной задачи я пытаюсь создать и восстановить базу данных из файла резервной копии Sql-Server.Совместное использование временных файлов между пользователями

Файлы в конечном итоге находятся на рабочем столе пользователя, поэтому, когда я инструктирую Sql-Server для его восстановления, он жалуется на «Доступ запрещен». при чтении резервной копии.

RESTORE DATABASE [Acme] FROM DISK = 'C:\Users\matthew\Desktop\my-database.bak' WITH REPLACE 

Реагирует с

Msg 3201, Level 16, State 2, Line 2 Не удается открыть устройство резервного копирования 'C: \ Users \ мэттью \ Desktop \ My-database.bak'. Ошибка операционной системы 5 (Доступ запрещен.).

Перемещение файла в общедоступной области, как C:\Temp работ, как указано в следующем ответе: Why can't I read from .BAK files on my Desktop using SQL Express in Windows Authentication Mode

Однако C:\Temp не стандартный временный каталог Windows. Поскольку я использую PowerShell, я использую библиотеки .NET, например, используя GetTempPath. Это заканчивается указывая на

C: \ Users \ мэттью \ AppData \ Local \ Temp

, который до сих пор та же проблема разрешения.

Существует ли стандартный способ получения временного каталога, к которому может обратиться любой локальный пользователь?

EDIT: для пояснения пользователь matthew и пользователь, который восстанавливает резервную копию, отличаются.

+0

Пользователи должны всегда иметь доступ на запись в свою папку 'Temp'. Я бы исследовал, почему это не так. –

+2

Какой пользователь выполняет задачу восстановления? Если это другой пользователь, чем matthew, вы можете захотеть поместить файл резервной копии в другое место, которое является общедоступным (или, по крайней мере, доступным для группы, членом которой является пользователь восстановления). 'C: \ Users \ Public \ Documents' или' C: \ Users \ Public \ Downloads' приходят на ум. Создание временного каталога 'C: \ Temp' также не является чем-то необычным. –

+0

Понятие «стандартный каталог Windows» является разновидностью. Не похож на Linux «Стандарт иерархии файлов», где есть четкий стандарт. Люди использовали c: \ temp как временную директорию с MS-DOS 2.0, поэтому она в значительной степени стандартная, как она есть. Единственная ошибка, которую я вижу, - это если C: не является SystemDrive. Но если вы работаете в ИТ-организации, где настольные компьютеры Windows происходят из общего образа (ов), тогда это решение. В качестве альтернативы вы можете использовать $ env: HOMEDRIVE или $ env: SYSTEMDRIVE, чтобы определить, на каком диске искать \ TEMP (или посмотреть на оба). –

ответ

1

Нередко создается папка C:\Temp как системная справочная система. Для сценария резервного копирования/восстановления вам просто нужна папка, доступная как для резервного копирования, так и для пользователя восстановления, будь то настраиваемая папка, встроенная общая папка, например C:\Users\Public\Documents, или настроенные разрешения для пользовательского файла.

Однако с точки зрения безопасности, вероятно, неплохо создать выделенную папку (например, C:\backup), к которой имеют доступ только требуемые пользователи, например. например:

$backupDir = 'C:\backup' 
$backupUser = 'DOMAIN\userA' 
$restoreUser = 'DOMAIN\userB' 

function New-Ace { 
    [CmdletBinding()] 
    Param(
    [Parameter(Mandatory=$true)] 
    [string]$User, 

    [Parameter(Mandatory=$true)] 
    [string]$Access 
) 

    New-Object Security.AccessControl.FileSystemAccessRule ($User, $Access, 
    'ObjectInherit, ContainerInherit', 'None', 'Allow') 
} 

$dir = New-Item -Type Directory $backupDir 

$acl = Get-Acl -Path $dir 
$acl.SetAccessRuleProtection($true, $false) 
$acl.AddAccessRule((New-Ace -User $backupUser -Access 'Modify')) 
$acl.AddAccessRule((New-Ace -User $restoreUser -Access 'Read')) 
$acl | Set-Acl -Path $dir 
+0

Удивительный материал, это именно то, что мне нужно. – Matthew

Смежные вопросы