关于注册表的读写

jiefen 2002-07-18 08:22:12
希望读写HKEY_LOCAL_MACHINE中的数据,发现只有具有管理员权限(windows 2000)的用户使用此程序才能读写数据。换一般的用户就不能读写。为什么?
如何才能让本机所以的用户都能读写注册表中的相同数据呢?
...全文
42 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
acptvb 2002-07-22
  • 打赏
  • 举报
回复
感谢您使用微软产品。

一般的用户组如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 Long

Public 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 Long

Private 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 Long

Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
ByVal hKey As Long _
) As Long

Private szData As String * 255

Private 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 = &H100000

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))

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)

Logoff

End 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))。

acptvb 2002-07-22
  • 打赏
  • 举报
回复
感谢您使用微软产品。

一般的用户组如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 Long

Public 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 Long

Private 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 Long

Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
ByVal hKey As Long _
) As Long

Private szData As String * 255

Private 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 = &H100000

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))

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)

Logoff

End 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))。

zyl910 2002-07-20
  • 打赏
  • 举报
回复
可能有用

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
jiefen 2002-07-18
  • 打赏
  • 举报
回复
又加了30分,希望高手继续
pctommy 2002-07-18
  • 打赏
  • 举报
回复
win2000的安全系统对于用户的权限分的清楚极了,不过用GetTokenInformation和AdjustTokenPrivileges将权限令牌统一设置成注册表管理特权,任何的用户就都可以对HKEY_LM进行访问了(具体的MSDN上应该有介绍)

7,786

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧