在用户之间共享临时文件
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
我正在 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