在用户之间共享临时文件

时间:2016-01-28 22:04:57

标签: sql-server windows powershell permissions temporary-files

我正在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和正在恢复备份的用户是不同的。

1 个答案:

答案 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