none
用SetMultiStringValue在win2000注册表中写入键值出错 RRS feed

  • 问题

  • 大家好,

    windows 2000系统下,我用SetMultiStringValue函数往注册表下面的项中添加一个键值,却拒绝访问,下面的项是已经存在的: 
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0219&Pid_1000\000000000002

    同样的操作在xp下是可以用的。

    查了半天也不知道怎么回事,请教各位高手这是什么原因?windows 2000好像没有什么权限设置啊?

    谢谢回复!
    • 已移动 周雪峰MVP, Moderator 2009年2月19日 10:33 移动主题 (从 Visual Studio 相关讨论 移动到 Visual C++)
    • 已移动 Sheng Jiang 蒋晟Moderator 2009年2月23日 1:33 Windows API问题 (从 Visual C++ 移动到 Windows Vista 开发相关讨论)
    • 已移动 桂素伟Moderator 2009年5月19日 9:44 ([Loc]From:Windows Vista 开发相关讨论)
    • 已移动 MagicDreamModerator 2009年5月19日 9:47 C++开发相关 ([Loc]From:.NET Framework 一般性问题讨论区)
    2009年2月19日 10:03

答案

全部回复

  • windows 2000的注册表有权限设置。在Regedt32工具里面可以看到。


    MSMVP VC++
    2009年2月19日 20:31
    版主
  • 谢谢,可是在regedt32里面权限也不可设置,是灰的。
     
    我不是要手动实现,请问如何编程设置权限?

    Open时已经默认是KEY_ALL_ACCESS了啊。
    2009年2月20日 2:07
  • 灰的表示你没有权限设置
    MSMVP VC++
    2009年2月20日 2:47
    版主
  • msdn上描述:When you call the RegOpenKeyEx function, the system checks the requested access rights against the key's security descriptor. If the user does not have the correct access to the registry key, the open operation fails. 

    如果用户不具备管理员权限,那么用Open请求的KEY_ALL_ACCESS权限就和键的安全描述符不匹配,就拒绝访问,无法修改注册表,怎样修改用户的注册表权限,让所有用户都可以运行应用程序修改注册表啊?
    2009年2月20日 8:21
  • 需要有管理员权限。
    MSMVP VC++
    2009年2月20日 12:16
    版主
  • 有管理员权限的用户(非系统默认的管理员)也需要手动添加该键值的访问控制权限才可以改写注册表,请问如何编程实现,不需要手动设置就能让所有的有管理员权限的用户都能访问?

    When you call the RegOpenKeyEx function, the system checks the requested access rights against the key's security descriptor. If the user does not have the correct access to the registry key, the open operation fails.

    If an administrator needs access to the key, the solution is to enable the SE_TAKE_OWNERSHIP_NAME privilege and open the registry key with WRITE_OWNER access.

    “enable the SE_TAKE_OWNERSHIP_NAME privilege and open the registry key with WRITE_OWNER access”这个需要如何实现?
    2009年2月23日 1:19
  •  请帮我看看下列的代码是否有问题:

    // Open a handle to the access token for the calling process.
        if (!OpenProcessToken(GetCurrentProcess(),
                              TOKEN_ADJUST_PRIVILEGES,
                              &hToken))
           {
              printf("OpenProcessToken failed: %u\n", GetLastError()); 
              goto Cleanup;
           }

        // Enable the SE_TAKE_OWNERSHIP_NAME privilege.
        if (!SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, TRUE))
        {
            printf("You must be logged on as Administrator.\n");
            goto Cleanup;
        }

     //open the key handle
     regSubKey.Open(HKEY_LOCAL_MACHINE, DRIVER_ENUM_KEY_NAME, WRITE_OWNER);

      //set the key value
       regSubKey.SetMultiStringValue(DRIVER_FILTER_TYPE, FILTER_DRIVER_NAME);
     
     //close the key handle
     lRtReg = regSubKey.Close();
     

    这样调试的结果是:Open返回的错误代码是0x05,access denied,这样设置有什么问题?

    请问有没有例子以供参考,谢谢!

    2009年2月23日 3:02
  • 还是没权限的问题。你为什么要作为owner打开?
    MSMVP VC++
    2009年2月23日 5:01
    版主
  • msdn上说的啊:If an administrator needs access to the key, the solution is to enable the SE_TAKE_OWNERSHIP_NAME privilege and open the registry key with WRITE_OWNER access.

    我也尝试用KEY_ALL_ACCESS打开,还是一样的结果。。。
    2009年2月23日 5:05
  • take owner之后你仍旧需要吧你自己添加到ACL里面去。参考http://support.microsoft.com/kb/245153
    MSMVP VC++
    2009年2月23日 5:12
    版主
  • 疑惑?如何将自己添加到ACL?

    有代码可以参考吗?或者能否解释详尽一点,我是初学者,不怎么懂...
    2009年2月23日 5:51
  • http://www.google.com/codesearch?hl=en&lr=&q=registry+ACL&sbtn=Search

    如果计算机在域里面,则需要修改DACL

    MSMVP VC++
    2009年2月23日 14:27
    版主
  •  谢谢:)

    我参考Taking Object Ownership in C++
    http://msdn.microsoft.com/en-us/library/aa379620(VS.85).aspx

    问题已得到解决。
    2009年2月24日 7:45