我正在PowerShell中构建一个Web应用程序部署脚本,对于一个任务,我尝试从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 \ matthew \ 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:\用户\马修\应用程序数据\本地\温度
仍有相同的权限问题。
是否有标准的方法来获取任何本地用户都可以访问的临时目录?
编辑:澄清一下,用户matthew
和正在恢复备份的用户是不同的。
答案 0 :(得分: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