我在编写的 VB 程序以及在 64 位操作系统(如 Win2k8 或 Win2k3)中访问 Windows 注册表的 setup.exe 遇到了一些问题。
第一部分:setup.exe 和 Windows 注册表 的问题 首先我将解释 setup.exe 的问题。在安装期间,我有一个自定义操作在安装期间触发以将注册表更改为:
HKLM/软件/Microsoft/Windows NT/CurrentVersion/WinLogin/Userinit。
在 32 位操作系统上它工作正常,但在 64 位操作系统上它写入:
HKLM/软件/WOW6432Node/Microsoft/Windows NT/CurrentVersion/Winlogon/Userinit
我的问题是,当用户登录时,登录过程不会从该位置读取。我理解它为什么要访问 64 位注册表的 32 位部分。这是因为 setup.exe 是一个 32 位进程。我在任何地方都找不到如何将其设置为 64 位。也许所有 setup.exe 都是 32 位的,我不知道,因为我是创建安装程序的新手。关于如何解决这个问题的任何想法?
第二部分:64位进程访问Windows注册表 的问题第二个问题是当我的程序在用户登录后立即运行时。假设设置了一个注册表值,以防止用户运行“任务管理器”并能够杀死应用程序. 我知道规避 Windows 安全性可能是一种糟糕的编码实践,但这是我正在为我的公司编写的内部应用程序。
下面的代码是触发任务管理器锁定和解锁的函数。在 32 位系统上它工作得很好,它是在 64 位系统上不起作用。启用 UAC 时也会出现一些问题。我不希望用户被提示以管理员身份运行,并且也不知道该怎么做。有任何想法吗?
Private Sub taskMgrState(ByVal state As String)
Dim hive As String = "HKEY_CURRENT_USER\"
Dim systemSubKey As String = "Software\Microsoft\Windows\CurrentVersion\Policies\System"
If state = "enabled" Then
'enable task manager use
'create the subkey for later use
If My.Computer.Registry.GetValue(hive & systemSubKey, "DisableTaskMgr", Nothing) Is Nothing Then
My.Computer.Registry.LocalMachine.CreateSubKey(systemSubKey)
End If
'set DisableTaskMgr valuename to 0 which disables blocking the running of task manager
My.Computer.Registry.SetValue(hive & systemSubKey, "DisableTaskMgr", 0)
ElseIf state = "disabled" Then
'disable the use of the task manager while this app is running
If My.Computer.Registry.GetValue(hive & systemSubKey, "DisableTaskMgr", Nothing) Is Nothing Then
My.Computer.Registry.LocalMachine.CreateSubKey(systemSubKey)
End If
'set DisableTaskMgr valuename to 0 which disables blocking the running of task manager
My.Computer.Registry.SetValue(hive & systemSubKey, "DisableTaskMgr", 1)
End If
End Sub