签名程序集访问被拒绝

Ris*_*sho 17 visual-studio-2010

我最近升级到了WIndows 7.当我尝试在VS2010中演唱组件时,我收到"访问被拒绝"错误.我以管理员身份登录,所以我很困惑.VS使用哪些服务帐户来提升其特权?

谢谢,

Risho

Ris*_*sho 37

我不知道它是Window 7还是公司政策,但我必须拥有C:\ Users\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys文件夹的所有权并给予我自己完全控制权.这纠正了这个问题.

  • @SJP FYI,C:\ Users\All Users是C:\ ProgramData的别名,在不显示隐藏的系统文件的情况下可见. (8认同)
  • 使用Windows 10文件夹略有不同:我必须将权限添加到C:\ Users\All Users\Microsoft\Crypto\RSA\MachineKeys(没有应用程序数据),否则它按照描述工作. (7认同)
  • 是的,这绝对有效。令人讨厌的问题。您只需要将“仅此文件夹”设置为“完全控制”即可。 (2认同)
  • 对我来说,它是 'C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys' 但同样的原理也有效。 (2认同)

mis*_*ika 19

解决方案:

从管理员命令提示符运行以下命令:

对于 64 位系统:

reg add HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\StrongName /v MachineKeyset /t REG_DWORD /d 0
Run Code Online (Sandbox Code Playgroud)

对于 32 位系统:

reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName /v MachineKeyset /t REG_DWORD /d 0
Run Code Online (Sandbox Code Playgroud)

更改立即生效。

为什么会发生这种情况:

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,但我没有在以前的版本上测试它。

  • 您还可以使用 [sn 工具](https://docs.microsoft.com/en-us/dotnet/framework/tools/sn-exe-strong-name-tool) 执行这些功能:显示 `sn -m` MachineKeyset 的当前值,`sn -mn` 设置上面的注册表值 (4认同)