我最近升级到了 Windows 7。当我尝试在 VS2010 中签署程序集时,出现“访问被拒绝”错误。我以管理员身份登录,所以我很困惑。 VS 使用什么服务帐户,我应该提升其权限?
我不知道这是 Window 7 还是公司政策,但我必须拥有 C:\Users\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys 文件夹的所有权,并给予自己完全控制权。这解决了这个问题。
解决方案:
从管理员命令提示符运行以下命令:
对于 64 位系统:
reg add HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\StrongName /v MachineKeyset /t REG_DWORD /d 0
对于 32 位系统:
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName /v MachineKeyset /t REG_DWORD /d 0
更改立即生效。
为什么会发生这种情况:
Visual Studio 用于签署程序集的 MS 程序集链接器 ALINK (AL.EXE) 在其工作期间会创建一个临时加密密钥。实际上它为此使用了一些内部 CLR 函数,问题是默认使用 CRYPT_MACHINE_KEYSET 标志。这需要提升权限,这就是为什么“以管理员身份”运行 VS 的原因。
但是,幸运的是,我发现 CLR 有一个用于 StrongName 签名的全局标志,并且它存储在系统注册表中的
下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName
并且由 DWORD 值控制
机器按键。
0 - 使用当前用户密钥集
1 - 使用机器按键组(这是默认值)
Visual Studio 是一个 32 位应用程序,使用 32 位版本的 AL.EXE 进行构建。因此,在 64 位系统上,它受到 注册表重定向 的影响,并且该标志位于密钥下方
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\StrongName
它可以在我的 VS2019、Win10 和 .Net Framework 4.8 上运行,但我没有在以前的版本上进行测试。
在 Win10 上,我向正在启动 Visual Studio 的用户授予读取、写入、运行、更改和显示文件夹的权限:
C:\ProgramData\Microsoft\Crypto
对于 Windows 10 和 VS 2015,我必须以管理员身份运行 VS。