win2000的安全系统对于用户的权限分的清楚极了,不过用GetTokenInformation和AdjustTokenPrivileges将权限令牌统一设置成注册表管理特权,任何的用户就都可以对HKEY_LM进行访问了(具体的MSDN上应该有介绍)

解决方案 »

  1.   

    可能有用VB操作注册表:
    http://www.sqreg.com/file/vb/reg_01.htm
    http://www.sqreg.com/file/vb/reg_02.htm
    http://www.sqreg.com/file/vb/reg_03.htm
    http://www.sqreg.com/file/vb/reg_04.htm
    http://www.sqreg.com/file/vb/reg_05.htm
    http://www.sqreg.com/file/vb/reg_06.htm
    http://www.sqreg.com/file/vb/reg_07.htm
      

  2.   

    感谢您使用微软产品。一般的用户组如user没有权限更改本机的系统设置,也没有权限对HKEY_LOCAL_MACHINE下的键执行RegOpenKeyEx。
    您可以利用LogonUser,ImpersonateLoggedOnUser,RevertToSelf等函数让用户自动以指定用户帐号loggon,获得权限,执行完操作后logoff,恢复到用户原来的权限。如下例让用户查询系统硬件信息:在Module中添加:
    Public Declare Function LogonUser Lib "advapi32.dll" _
       Alias "LogonUserA" (ByVal lpszUsername As String, _
       ByVal lpszDomain As String, ByVal lpszPassword As String, _
       ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, _
       phToken As Long) As LongPublic Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
    Public Declare Function RevertToSelf Lib "advapi32.dll" () As Long在Form中添加:
    Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" ( _
       ByVal hKey As Long, _
       ByVal lpSubKey As String, _
       ByVal ulOptions As Long, _
       ByVal samDesired As Long, _
       phkResult As Long) As LongPrivate Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" ( _
       ByVal hKey As Long, _
       ByVal lpValueName As String, _
       ByVal lpReserved As Long, _
       ByVal lpType As Long, _
       ByVal lpData As String, _
       lpcbData As Long _
    ) As LongPrivate Declare Function RegCloseKey Lib "advapi32.dll" ( _
       ByVal hKey As Long _
    ) As LongPrivate szData As String * 255Private Const KEY_CREATE_LINK = &H20
    Private Const KEY_CREATE_SUB_KEY = &H4
    Private Const KEY_ENUMERATE_SUB_KEYS = &H8
    Private Const STANDARD_RIGHTS_ALL = &H1F0000
    Private Const KEY_QUERY_VALUE = &H1
    Private Const KEY_SET_VALUE = &H2
    Private Const KEY_NOTIFY = &H10
    Private Const SYNCHRONIZE = &H100000Private 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))Private Const HKEY_LOCAL_MACHINE = &H80000002 Private Const LOGON32_LOGON_INTERACTIVE = 2
          Private Const LOGON32_PROVIDER_DEFAULT = 0    Public Sub Logon(ByVal strAdminUser As String, ByVal _
       strAdminPassword As String, ByVal strAdminDomain As String)
            Dim lngTokenHandle, lngLogonType, lngLogonProvider As Long
            Dim blnResult As Boolean
            
            lngLogonType = LOGON32_LOGON_INTERACTIVE
            lngLogonProvider = LOGON32_PROVIDER_DEFAULT
            
            blnResult = RevertToSelf()
            
            blnResult = LogonUser(strAdminUser, strAdminDomain, strAdminPassword, _
                                                 lngLogonType, lngLogonProvider, _
                                                 lngTokenHandle)
                                                                 
            blnResult = ImpersonateLoggedOnUser(lngTokenHandle)
          End Sub      Public Sub Logoff()
            Dim blnResult As Boolean
            
            blnResult = RevertToSelf()
          End Sub
          
    Private Sub Command1_Click()Logon "AdminUsername", "password", "DomainName"    Dim RetVal As Integer
        Dim szValue As String
        
        Dim hKey As Long
        Dim sType As Long
        
        
           RetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\KEYBOARDCLASS", 0&, KEY_ALL_ACCESS, hKey)
     
        If ((RegQueryValueEx(hKey, "\Device\KeyboardClass0", 0, sType, szData, Len(szData))) <> 0) Then
        
           ' Error Handling ---- Something Wrong
           MsgBox "regQuery error"
        Else
        
           ' Error Handling ---- Nothing Wrong
           Text1.Text = szData
          
        End If
        
        RetVal = RegCloseKey(hKey)
        
    LogoffEnd Sub详细信息请请参考:
    Q248187 HOWTO: Impersonate a User from Active Server Pages
    http://support.microsoft.com/support/kb/articles/q248/1/87.asp
    Registry Functions
    http://msdn.microsoft.com/library/en-us/sysinfo/regapi_59mb.asp- 微软全球技术中心 VB技术支持本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
      

  3.   

    感谢您使用微软产品。一般的用户组如user没有权限更改本机的系统设置,也没有权限对HKEY_LOCAL_MACHINE下的键执行RegOpenKeyEx。
    您可以利用LogonUser,ImpersonateLoggedOnUser,RevertToSelf等函数让用户自动以指定用户帐号loggon,获得权限,执行完操作后logoff,恢复到用户原来的权限。如下例让用户查询系统硬件信息:在Module中添加:
    Public Declare Function LogonUser Lib "advapi32.dll" _
       Alias "LogonUserA" (ByVal lpszUsername As String, _
       ByVal lpszDomain As String, ByVal lpszPassword As String, _
       ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, _
       phToken As Long) As LongPublic Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
    Public Declare Function RevertToSelf Lib "advapi32.dll" () As Long在Form中添加:
    Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" ( _
       ByVal hKey As Long, _
       ByVal lpSubKey As String, _
       ByVal ulOptions As Long, _
       ByVal samDesired As Long, _
       phkResult As Long) As LongPrivate Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" ( _
       ByVal hKey As Long, _
       ByVal lpValueName As String, _
       ByVal lpReserved As Long, _
       ByVal lpType As Long, _
       ByVal lpData As String, _
       lpcbData As Long _
    ) As LongPrivate Declare Function RegCloseKey Lib "advapi32.dll" ( _
       ByVal hKey As Long _
    ) As LongPrivate szData As String * 255Private Const KEY_CREATE_LINK = &H20
    Private Const KEY_CREATE_SUB_KEY = &H4
    Private Const KEY_ENUMERATE_SUB_KEYS = &H8
    Private Const STANDARD_RIGHTS_ALL = &H1F0000
    Private Const KEY_QUERY_VALUE = &H1
    Private Const KEY_SET_VALUE = &H2
    Private Const KEY_NOTIFY = &H10
    Private Const SYNCHRONIZE = &H100000Private 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))Private Const HKEY_LOCAL_MACHINE = &H80000002 Private Const LOGON32_LOGON_INTERACTIVE = 2
          Private Const LOGON32_PROVIDER_DEFAULT = 0    Public Sub Logon(ByVal strAdminUser As String, ByVal _
       strAdminPassword As String, ByVal strAdminDomain As String)
            Dim lngTokenHandle, lngLogonType, lngLogonProvider As Long
            Dim blnResult As Boolean
            
            lngLogonType = LOGON32_LOGON_INTERACTIVE
            lngLogonProvider = LOGON32_PROVIDER_DEFAULT
            
            blnResult = RevertToSelf()
            
            blnResult = LogonUser(strAdminUser, strAdminDomain, strAdminPassword, _
                                                 lngLogonType, lngLogonProvider, _
                                                 lngTokenHandle)
                                                                 
            blnResult = ImpersonateLoggedOnUser(lngTokenHandle)
          End Sub      Public Sub Logoff()
            Dim blnResult As Boolean
            
            blnResult = RevertToSelf()
          End Sub
          
    Private Sub Command1_Click()Logon "AdminUsername", "password", "DomainName"    Dim RetVal As Integer
        Dim szValue As String
        
        Dim hKey As Long
        Dim sType As Long
        
        
           RetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\KEYBOARDCLASS", 0&, KEY_ALL_ACCESS, hKey)
     
        If ((RegQueryValueEx(hKey, "\Device\KeyboardClass0", 0, sType, szData, Len(szData))) <> 0) Then
        
           ' Error Handling ---- Something Wrong
           MsgBox "regQuery error"
        Else
        
           ' Error Handling ---- Nothing Wrong
           Text1.Text = szData
          
        End If
        
        RetVal = RegCloseKey(hKey)
        
    LogoffEnd Sub详细信息请请参考:
    Q248187 HOWTO: Impersonate a User from Active Server Pages
    http://support.microsoft.com/support/kb/articles/q248/1/87.asp
    Registry Functions
    http://msdn.microsoft.com/library/en-us/sysinfo/regapi_59mb.asp- 微软全球技术中心 VB技术支持本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。