访问被拒绝在 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】:将-Vr
与sn.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的主要内容,如果未能解决你的问题,请参考以下文章
shutil.rmtree 在 Windows 上因“访问被拒绝”而失败 [重复]
shutil.rmtree 在 Windows 上因“访问被拒绝”而失败 [重复]