【发布时间】: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\Documents或C:\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