【问题标题】:Sharing temporary files between users在用户之间共享临时文件
【发布时间】:2016-01-28 22:04:56
【问题描述】:

我正在 PowerShell 中构建一个 Web 应用程序部署脚本,对于一项任务,我尝试从 Sql-Server 备份文件创建和恢复数据库。

文件最终位于用户的桌面上,因此当我指示 Sql-Server 恢复它时,它会抱怨“访问被拒绝”。读取备份时出错。

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

回应

消息 3201,第 16 级,状态 2,第 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:\Users\matthew\AppData\Local\Temp

仍然有同样的权限问题。

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

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

【问题讨论】:

  • 用户应该始终拥有对自己的Temp 目录的写入权限。我会调查为什么不是这样。
  • 哪个用户正在运行恢复任务?如果它是与 matthew 不同的用户,您可能希望将备份文件放在其他可公开访问的位置(或至少可由恢复用户所属的组访问)。 C:\Users\Public\DocumentsC:\Users\Public\Downloads 浮现在脑海中。创建临时目录C:\Temp 也很常见。
  • “标准 Windows 目录”的概念有点模糊。不像 Linux 的“文件层次标准”,它有一个明确的标准。人们从 MS-DOS 2.0 开始就使用 c:\temp 作为临时目录,所以它几乎是标准的。我看到的唯一缺陷是如果 C: 不是 SystemDrive。但是,如果您在 IT 组织中工作,Windows 桌面来自通用映像,那么问题就解决了。或者,您可以使用 $env:HOMEDRIVE 或 $env:SYSTEMDRIVE 来确定要在哪个驱动器上查找 \TEMP(或同时查找)。
  • 我可能只使用 c:\Windows\temp,或者只是创建一个临时文件夹作为脚本的一部分并将备份文件放在那里供所有人访问。
  • 大家好,我自己做,简单点。

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


【解决方案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

【讨论】:

  • 很棒的东西,这正是我需要的。
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2022-08-14
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多