《转自VB版》一般的用户组如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
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技术支持
您可以利用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技术支持