访问被拒绝在 Windows 7 上运行 sn.exe

Posted

技术标签:

【中文标题】访问被拒绝在 Windows 7 上运行 sn.exe【英文标题】:Access denied running sn.exe on Windows 7 【发布时间】:2010-01-05 10:08:07 【问题描述】:

我正在尝试在 Windows 7 机器上构建/签署程序集,但出现以下异常:

x:\> SN -q -Vr "x:\someassembly.dll"
Failed to open registry key -- Access is denied.

我发现以下线程似乎是同样的问题,它提到他通过更改注册表项的权限来修复它,但是它没有提到哪个注册表项。

http://social.msdn.microsoft.com/Forums/en-US/tfsbuild/thread/e84e015b-41c8-4170-8686-2474832fcd28

有人遇到过这种情况吗?

【问题讨论】:

我遇到了类似的问题...试试这个...***.com/questions/11887/… 【参考方案1】:

好的,我使用Process Mon 确定了有问题的密钥,其中列出了以下内容:

sn.exe
RegCreateKey
HKLM\SOFTWARE\Wow6432Node\Microsoft\StrongName
ACCESS DENIED
Desired Access: Maximum Allowed

为当前用户授予对以下密钥的写入权限解决了这个问题

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft

请注意,授予对根 HKLM 节点的写入权限没有解决了我的问题(显然注册表中文件夹的权限不是递归的?)

【讨论】:

我能够从提升的控制台执行 sn.exe,但无法从提升的提示符执行构建过程中的另一个步骤。我尝试了贾斯汀的建议,但发现那行不通。然后我使用ProcMon 来查看 sn 试图写入哪些键,结果是:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName。一旦我授予我的帐户对该密钥的完全访问权限,它就起作用了。 授予普通用户对系统强名称元数据的写入权限——更重要的是,对整个系统关键的Microsoft 密钥——是一种安全妥协。您正在调用 -Vr(注册一个程序集以跳过强名称验证),这确实是一项特权操作。 就我而言,我使用了提升的权限。但是,我使用 Powershell 调用该程序。【参考方案2】:

如果是这种情况,您可以使用Process Monitor 查看 sn.exe 正在尝试访问的注册表项。不过,这与编程无关。

【讨论】:

【参考方案3】:

-Vrsn.exe 一起使用被认为存在潜在的安全风险,因为它会禁用签名验证。这就是为什么你不能从非特权命令提示符运行sn.exe -Vr

在尝试执行 sn.exe -Vr 之前打开提升的命令提示符(具有管理权限)。

顺便说一句,使用-Vr 注册了一个验证条目(表示不应验证指定的程序集或程序集),并且只能在执行插桩二进制文件时临时使用(插桩后未签名)。

完成后不要忘记使用-Vu 取消注册该条目。

【讨论】:

【参考方案4】:

正如其他人和我自己所指出的,-Vr(在系统范围内为强名称验证跳过注册程序集)确实是一项特权操作,并且您获得的“拒绝访问”是合法的。

根据Sn.exe (Strong Name Tool) - MSDN,您可以添加一个用户名来指定禁用检查的用户。这不应该需要管理权限:

sn -Vr <Assembly> %USERNAME%

【讨论】:

以上是关于访问被拒绝在 Windows 7 上运行 sn.exe的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上 pip 安装访问被拒绝

shutil.rmtree 在 Windows 上因“访问被拒绝”而失败 [重复]

shutil.rmtree 在 Windows 上因“访问被拒绝”而失败 [重复]

在 Windows 7 上创建文件会导致“拒绝访问”异常

在 Windows 10 上使用 XAMPP 连接到 MySQL 数据库的访问被拒绝

带有安全管理器的 Tomcat 9.0 在 Windows 上报告访问被拒绝