在用户之间共享临时文件

Sharing temporary files between users

我正在 PowerShell 中构建 Web 应用程序部署脚本,为了完成一项任务,我正在尝试从 Sql-服务器备份文件创建和恢复数据库。

文件最终在用户的桌面上,所以当我指示 Sql-Server 恢复它时,它在读取备份时抱怨 'Access is denied.' 错误。

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

回复

Msg 3201, Level 16, State 2, Line 2 Cannot open backup device 'C:\Users\matthew\Desktop\my-database.bak'. Operating system error 5(Access is denied.).

将文件移动到像 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\matthew\AppData\Local\Temp

仍然存在同样的权限问题。

是否有标准方法来获取任何本地用户都可以访问的临时目录?

编辑:澄清一下,用户 matthew 和恢复备份的用户不同。

创建文件夹 C:\Temp 作为系统范围的临时目录并不少见。对于 backup/restore 场景,您只需要一个备份和还原用户都可以访问的文件夹,无论是自定义文件夹、内置 public 文件夹(如 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