找回密码
 加入
搜索
查看: 14200|回复: 22

[系统综合] [已解决]希望知道如何用AU3修改注册表项名称,不是键值和子键名

[复制链接]
发表于 2010-3-22 09:16:46 | 显示全部楼层 |阅读模式
本帖最后由 hhs66317 于 2010-3-22 16:52 编辑

譬如:注册表
HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider\S-1-5-21-515967899-1757981266-1801674531-500
“S-1-5-21-515967899-1757981266-1801674531-500”是一个项名称,该项目正常情况下应该每台机器都不一样,因为系统封装后,如果选择重新生成SID,会导致某些写入该键值的程序无法卸载,所以在这里恳请大家提供一个可以修改注册表项目名称的代码。
我找遍了帮助文档,只有读写注册表键值的代码,没有改写项目名称的代码。
如蒙赐教,感激不尽
 楼主| 发表于 2010-3-22 09:52:34 | 显示全部楼层
我还在耐心等待,同时我也在找方法
发表于 2010-3-22 10:29:17 | 显示全部楼层
RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider\S-1-5-21-515967899-1757981266-1801674531-501”)这样不行吗?
发表于 2010-3-22 10:33:28 | 显示全部楼层
没办法的办法,先读取需要修改的项所有内容,然后修改数据再写入,最后删除之前要修改的项
 楼主| 发表于 2010-3-22 10:37:08 | 显示全部楼层
对于我自己的机器,“S-1-5-21-515967899-1757981266-1801674531-500“是固定的
不同机器的我也可以获取到
我现在就是想能够直接的把获取到的那个项目名替换掉原来的”S-1-5-21-515967899-1757981266-1801674531-500“
 楼主| 发表于 2010-3-22 10:39:12 | 显示全部楼层
就像在注册表编辑器中在该项目上右键”重命名“做的效果一样
直接更改掉
现在就假设我用一个确定的值来更改另一个确定的值
发表于 2010-3-22 10:53:17 | 显示全部楼层
S-1-5-21-515967899-1757981266-1801674531-500这个项名好象是系统分配的,不大容易改吧
发表于 2010-3-22 11:20:36 | 显示全部楼层
新手..学习..期待中!!
 楼主| 发表于 2010-3-22 11:47:37 | 显示全部楼层
这个注册表位置是可以改的
手工我都改过的
这个是计算机的SID
我主要就是想用另外一个值更改现有的这个值
AU3中没有发现有更改的方法。
发表于 2010-3-22 15:40:23 | 显示全部楼层
本帖最后由 pusofalse 于 2010-3-22 15:47 编辑

搜索了一下,关于更改注册表项名称的问题,以往并没有提出来。恰巧,这问题我以往也没有遇到过,刚刚google一下,找到一个API函数,调用如下。有什么理由不让我回答这个标题及描述都如此清晰并且便于搜索、以及没有错别字的帖子~?
#include <LocalSecurityAuthority.au3>

$fResult = _RegRenameKey("HKLM\Software\TEST", "NewKeyName")
Msgbox(0, $fResult, @error)

Func _RegRenameKey($sRegKey, $sNewName)
        Local $hRegKey, $pBuffer, $sSubKey, $hMainKey, $aRegKey, $iResult

        While StringRight($sRegKey, 1) = ""
                $sRegKey = StringTrimRight($sRegKey, 1)
        WEnd

        $aRegKey = StringSplit($sRegKey, "")
        Switch $aRegKey[1]
        Case "HKCR", "HKEY_CLASSES_ROOT"
                $hMainKey = 0x80000000
        Case "HKCU", "HKEY_CURRENT_USER"
                $hMainKey = 0x80000001
        Case "HKLM", "HKEY_LOCAL_MACHINE"
                $hMainKey = 0x80000002
        Case "HKU", "HKEY_USERS"
                $hMainKey = 0x80000003
        Case "HKCC", "HKEY_CURRENT_CONFIG"
                $hMainKey = 0x80000005
        Case Else
                Return SetError($ERROR_INVALID_PARAMETER, 0, 0)
        EndSwitch

        $sSubKey = StringTrimLeft($sRegKey, StringLen($aRegKey[1]) + 1)
        $hRegKey = _RegOpenKeyEx($hMainKey, $sSubKey, $GENERIC_WRITE)
        If ($hRegKey < 1) Then Return SetError(@error, 0, 0)

        $pBuffer = _LsaInitializeBufferW($sNewName)
        $iResult = DllCall("Ntdll.dll", "dword", "NtRenameKey", "hWnd", $hRegKey, "ptr", $pBuffer)
        _FreeVariable($pBuffer, 0, _HeapFree($pBuffer), _LsaNtStatusToWinError($iResult[0]))
        Return SetError(@error, _RegCloseKey($hRegKey), $iResult[0] = 0)
EndFunc        ;==>_RegRenameKey
 楼主| 发表于 2010-3-22 16:10:44 | 显示全部楼层
多谢版主赐教,惭愧我自己竟然没有搜索到
我也是尽量描述清楚,只有这样才有可能得到大家的帮助
 楼主| 发表于 2010-3-22 16:35:46 | 显示全部楼层
为什么我运行后没有达到预期的效果呢?
我首先下载了LocalSecurityAuthority.au3
然后修改上边代码
$fResult = _RegRenameKey("HKLM\Software\TEST", "NewKeyName")
$fResult = _RegRenameKey("HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider\S-1-5-21-515967899-1757981266-1801674531-500", "S-1-5-21-515967899-1757981266-1801674531-501")
发现没有修改成功
刚刚自己手工修改了下,发现提示不能修改
看了下该注册表项的属性,发现权限不够
 楼主| 发表于 2010-3-22 16:52:29 | 显示全部楼层
刚刚建立一个其他的注册表键值,发现没有问题,看来确实是权限的问题
不得不说“pusofalse”的代码确实管用
谢谢
发表于 2010-3-22 17:03:06 | 显示全部楼层
回复 12# hhs66317


    修改权限的代码:
#include <LocalSecurityAuthority.au3>
Local $hMainKey = 0x80000002 ; HKEY_LOCAL_MACHINE
Local $sSubKey = "Software\TEST" ; Subkey
Local $aDacl[4][4] = [["SYSTEM", 0xF003F, $GRANT_ACCESS, 3], _
                 [@UserName, 0xF003F, $GRANT_ACCESS, 3], _
                 ["Everyone", 0x1200A9, $GRANT_ACCESS, 3], _
                 ["Users", 0x1200A9, $GRANT_ACCESS, 3]]
; 0xF003F - KEY_ALL_ACCESS ; 完全控制 (Full control)
; 0x1200A9 - KEY_READ ; 只读 (Read-only)
; GRANT_ACCESS ; 访问类型-允许 ; DENY_ACCESS ; 访问类型-拒绝。
; 3 - 权限继承到子键。

$fResult = _RegSetKeySecurityDacl($hMainKey, $sSubKey, $aDacl)
Msgbox(0, $fResult, @error) ; Returns true if succeeds.
 楼主| 发表于 2010-3-22 17:22:48 | 显示全部楼层
对于上边代码的第二行不懂
Local $hMainKey = 0x80000002 ; HKEY_LOCAL_MACHINE
这里是应该填写HKEY_LOCAL_MACHINE,还是0x80000002
如果是0x80000002,那0x80000002又是什么?从来没见过
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 22:05 , Processed in 0.082478 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表