都是用regedt32.exe来修改注册中某一项的权限问题
能不能用API来实现啊,晚上找的都是C++的
附C++代码:
#include <Windows.h> 
#include <Aclapi.h> 
#pragma comment (lib,"Advapi32.lib") void main() 

  DWORD dwRet; 
  LPSTR SamName = "MACHINE\\SAM\\SAM"; 
  PSECURITY_DESCRIPTOR pSD = NULL; 
  PACL pOldDacl = NULL; 
  PACL pNewDacl = NULL; 
  EXPLICIT_ACCESS ea; 
  HKEY hKey = NULL;   // 获取SAM主键的DACL 
  dwRet = GetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, 
          NULL, NULL, &pOldDacl, NULL, &pSD); 
  if (dwRet != ERROR_SUCCESS) 
  { 
    printf("GetNamedSecurityInfo Error: %d\n", dwRet); 
    goto FreeAndExit; 
  }   // 创建一个ACE,允许Everyone完全控制对象,并允许子对象继承此权限 
  ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); 
  BuildExplicitAccessWithName(&ea, "Everyone", KEY_ALL_ACCESS, SET_ACCESS, 
    SUB_CONTAINERS_AND_OBJECTS_INHERIT);   // 将新的ACE加入DACL 
  dwRet = SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl); 
  if (dwRet != ERROR_SUCCESS) 
  { 
    printf("SetEntriesInAcl Error: %d\n", dwRet); 
    goto FreeAndExit; 
  }   // 更新SAM主键的DACL 
  dwRet = SetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, 
          NULL, NULL, pNewDacl, NULL); 
  if (dwRet != ERROR_SUCCESS) 
  { 
    printf("SetNamedSecurityInfo Error: %d\n", dwRet); 
    goto FreeAndExit; 
  }   // 打开SAM的子键 
  dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SAM\\SAM\\Domains\\Account\\Users\\000001F4", 
          0, KEY_ALL_ACCESS, &hKey); 
  if (dwRet != ERROR_SUCCESS) 
  { 
    printf("RegOpenKeyEx Error: %d\n", dwRet); 
    goto FreeAndExit; 
  }   printf("Open SAM Subkey Successfully.\n"); FreeAndExit: 
  if (hKey) RegCloseKey(hKey); 
  if (pNewDacl) LocalFree(pNewDacl); 
  // 还原SAM主键的DACL 
  if (pOldDacl) SetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, 
                NULL, NULL, pOldDacl, NULL); 
  if (pSD) LocalFree(pSD); 
  return; 
}请问各位大侠能不能用VB修改啊,另外陈辉的那个代码,小弟不才,看不大懂,运行不起来陈大侠代码地址如下:http://blog.csdn.net/chenhui530/archive/2007/10/03/1810302.aspx 
只有74分了,全部给了

解决方案 »

  1.   

    http://support.microsoft.com/kb/295004/zh-cn
      

  2.   

    ' 这个模块用于读和写注册表关键字。
    ' 不同于VB 的内部注册表访问方法,它可以
    ' 通过字符串的值来读和写任何注册表关键字。
    Option Explicit
    '---------------------------------------------------------------
    '-注册表 API 声明...
    '---------------------------------------------------------------
    Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
    Private Declare Function RegCreateKeyEx Lib "advapi32" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Long, ByRef lpdwDisposition As Long) As Long
    Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
    Private Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long'---------------------------------------------------------------
    '- 注册表 Api 常数...
    '---------------------------------------------------------------
    ' Reg Data Types...
    Const REG_SZ = 1                         ' Unicode空终结字符串
    Const REG_EXPAND_SZ = 2                  ' Unicode空终结字符串
    Const REG_DWORD = 4                      ' 32-bit 数字' 注册表创建类型值...
    Const REG_OPTION_NON_VOLATILE = 0       ' 当系统重新启动时,关键字被保留' 注册表关键字安全选项...
    Const READ_CONTROL = &H20000
    Const KEY_QUERY_VALUE = &H1
    Const KEY_SET_VALUE = &H2
    Const KEY_CREATE_SUB_KEY = &H4
    Const KEY_ENUMERATE_SUB_KEYS = &H8
    Const KEY_NOTIFY = &H10
    Const KEY_CREATE_LINK = &H20
    Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
    Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
    Const KEY_EXECUTE = KEY_READ
    Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
                           KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
                           KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
                         
    ' 注册表关键字根类型...
    Const HKEY_CLASSES_ROOT = &H80000000
    Const HKEY_CURRENT_USER = &H80000001
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const HKEY_USERS = &H80000003
    Const HKEY_PERFORMANCE_DATA = &H80000004' 返回值...
    Const ERROR_NONE = 0
    Const ERROR_BADKEY = 2
    Const ERROR_ACCESS_DENIED = 8
    Const ERROR_SUCCESS = 0'---------------------------------------------------------------
    '- 注册表安全属性类型...
    '---------------------------------------------------------------
    Private Type SECURITY_ATTRIBUTES
        nLength As Long
        lpSecurityDescriptor As Long
        bInheritHandle As Boolean
    End Type'-------------------------------------------------------------------------------------------------
    'sample usage - Debug.Print UpodateKey(HKEY_CLASSES_ROOT, "keyname", "newvalue")
    '-------------------------------------------------------------------------------------------------
    Public Function UpdateKey(KeyRoot As Long, KeyName As String, SubKeyName As String, SubKeyValue As String) As Boolean
        Dim rc As Long                                      ' 返回代码
        Dim hKey As Long                                    ' 处理一个注册表关键字
        Dim hDepth As Long                                  '
        Dim lpAttr As SECURITY_ATTRIBUTES                   ' 注册表安全类型
        
        lpAttr.nLength = 50                                 ' 设置安全属性为缺省值...
        lpAttr.lpSecurityDescriptor = 0                     ' ...
        lpAttr.bInheritHandle = True                        ' ...    '------------------------------------------------------------
        '- 创建/打开注册表关键字...
        '------------------------------------------------------------
        rc = RegCreateKeyEx(KeyRoot, KeyName, _
                            0, REG_SZ, _
                            REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, _
                            hKey, hDepth)                   ' 创建/打开//KeyRoot//KeyName
        
        If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError   ' 错误处理...
        
        '------------------------------------------------------------
        '- 创建/修改关键字值...
        '------------------------------------------------------------
        If (SubKeyValue = "") Then SubKeyValue = " "        ' 要让RegSetValueEx() 工作需要输入一个空格...
        
        ' 创建/修改关键字值
        rc = RegSetValueEx(hKey, SubKeyName, _
                           0, REG_SZ, _
                           SubKeyValue, LenB(StrConv(SubKeyValue, vbFromUnicode)))
                           
        If (rc <> ERROR_SUCCESS) Then GoTo CreateKeyError   ' 错误处理
        '------------------------------------------------------------
        '- 关闭注册表关键字...
        '------------------------------------------------------------
        rc = RegCloseKey(hKey)                              ' 关闭关键字
        
        UpdateKey = True                                    ' 返回成功
        Exit Function                                       ' 退出
    CreateKeyError:
        UpdateKey = False                                   ' 设置错误返回代码
        rc = RegCloseKey(hKey)                              ' 试图关闭关键字
    End Function'-------------------------------------------------------------------------------------------------
    'sample usage - Debug.Print GetKeyValue(HKEY_CLASSES_ROOT, "COMCTL.ListviewCtrl.1\CLSID", "")
    '-------------------------------------------------------------------------------------------------
    Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String) As String
        Dim i As Long                                           ' 循环计数器
        Dim rc As Long                                          ' 返回代码
        Dim hKey As Long                                        ' 处理打开的注册表关键字
        Dim hDepth As Long                                      '
        Dim sKeyVal As String
        Dim lKeyValType As Long                                 ' 注册表关键字数据类型
        Dim tmpVal As String                                    ' 注册表关键字的临时存储器
        Dim KeyValSize As Long                                  ' 注册表关键字变量尺寸
        
        ' 在 KeyRoot {HKEY_LOCAL_MACHINE...} 下打开注册表关键字
        '------------------------------------------------------------
        rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' 打开注册表关键字
        
        If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' 处理错误...
        
        tmpVal = String$(1024, 0)                             ' 分配变量空间
        KeyValSize = 1024                                       ' 标记变量尺寸
        
        '------------------------------------------------------------
        ' 检索注册表关键字的值...
        '------------------------------------------------------------
        rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
                             lKeyValType, tmpVal, KeyValSize)    ' 获得/创建关键字的值
                            
        If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' 错误处理
          
        tmpVal = Left$(tmpVal, InStr(tmpVal, Chr(0)) - 1)    '------------------------------------------------------------
        ' 决定关键字值的转换类型...
        '------------------------------------------------------------
        Select Case lKeyValType                                  ' 搜索数据类型...
        Case REG_SZ, REG_EXPAND_SZ                              ' 字符串注册表关键字数据类型
            sKeyVal = tmpVal                                     ' 复制字符串的值
        Case REG_DWORD                                          ' 四字节注册表关键字数据类型
            For i = Len(tmpVal) To 1 Step -1                    ' 转换每一位
                sKeyVal = sKeyVal + Hex(Asc(Mid(tmpVal, i, 1)))   ' 一个字符一个字符地生成值。
            Next
            sKeyVal = Format$("&h" + sKeyVal)                     ' 转换四字节为字符串
        End Select
        
        GetKeyValue = sKeyVal                                   ' 返回值
        rc = RegCloseKey(hKey)                                  ' 关闭注册表关键字
        Exit Function                                           ' 退出
        
    GetKeyError:    ' 错误发生过后进行清除...
        GetKeyValue = vbNullString                              ' 设置返回值为空字符串
        rc = RegCloseKey(hKey)                                  ' 关闭注册表关键字
    End Function
      

  3.   

    比方说我要给下面这个注册的项加上权限不让别人修改里面的东西[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer]
      

  4.   

    比方说我要给下面这个注册的项加上权限不让别人修改里面的东西[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer]
      

  5.   

    Call BuildExplicitAccessWithName(ea, "administrator", KEY_READ, 3, SUB_CONTAINERS_AND_OBJECTS_INHERIT)这句中的第四个参数改成3就可以了,意思是拒绝。
    如果第三个参数是读那么就是拒绝读,如果第三个参数是写就是拒绝写
    第二个参数是指定的用户
      

  6.   

    http://download.csdn.net/source/1709681
      

  7.   


    能说明一下各个常数的意思不啊
    Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
    Private Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
    Private Const KEY_EXECUTE = (KEY_READ)
    Private Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
      

  8.   

    http://msdn.microsoft.com/en-us/library/aa374892(VS.85).aspx
      

  9.   

    http://download.csdn.net/source/1741635
    上面链接是VB操作注册码的示例,刚学VB时参照相关资料写的。楼主可以下载参考一下。