Vbscript 未找到注册表项,也未被删除

Vbscript 未找到注册表项,也未被删除,vbscript,windows-installer,registry,regedit,registrykey,Vbscript,Windows Installer,Registry,Regedit,Registrykey,我在apache服务器上托管了MSI。 有一个我在系统上以系统权限运行的服务exe。 此服务从服务器获取MSI,然后此服务(用C++编写)使用ShellExecute运行具有以下命令的批处理文件:- C:\WINDOWS\system32\msiexec.exe /i "C:\WINDOWS\TEMP\MY_MSI.msi" /qn /norestart /l*v "C:\WINDOWS\TEMP\MY.log" 最后运行从服务器获取的MSI。 MSI有一个自定义操作,如下所示:- <C

我在apache服务器上托管了MSI。 有一个我在系统上以系统权限运行的服务exe。 此服务从服务器获取MSI,然后此服务(用C++编写)使用ShellExecute运行具有以下命令的批处理文件:-

C:\WINDOWS\system32\msiexec.exe /i "C:\WINDOWS\TEMP\MY_MSI.msi" /qn /norestart /l*v "C:\WINDOWS\TEMP\MY.log"
最后运行从服务器获取的MSI。 MSI有一个自定义操作,如下所示:-

<CustomAction Id="Delete" Script="vbscript" Return="ignore" Execute="immediate">
            <![CDATA[const HKEY_CURRENT_USER = &H80000001
                      Dim Shell: Set Shell = CreateObject("WScript.Shell")
                      strKeyPath = "Software\Mine"
                      Function Log(msg)
                          Const msiMessageTypeInfo = &H04000000
                          Set record = Session.Installer.CreateRecord(1)
                          record.StringData(0) = "[1]"
                          record.StringData(1) = CStr(msg)
                          Session.Message msiMessageTypeInfo, record
                      End Function
                      Log("Path : ")
                      Log(strKeyPath)
                      Set objRegistry = GetObject("winmgmts:\\" & "." & "\root\default:StdRegProv")
                      DeleteRegKey HKEY_CURRENT_USER, strKeypath

                      Sub DeleteRegKey(HKEY_CURRENT_USER, strKeyPath)
                        If objRegistry.EnumKey(HKEY_CURRENT_USER, strKeyPath, arrSubkeys) = 0 Then
                          Log("Key exists!")
                        Else
                          Log("Key does not exists!")
                        End If
                        If IsArray(arrSubkeys) Then
                            Log("Entered If statement.")
                            For Each strSubkey In arrSubkeys
                                Log("Key : ")
                                Log(strSubkey)
                                DeleteRegKey HKEY_CURRENT_USER, strKeyPath & "\" & strSubkey
                            Next
                        End If
                        str = "HKCU\" & strKeyPath & "\"
                        Log("Deleting : ")
                        Log(str)
                        Shell.RegDelete(str)
                        Log("Deleted")
                      End Sub]]>
        </CustomAction>

尽管钥匙还在。但是,在日志中,会记录“密钥不存在!”。 我不知道为什么钥匙现在还没有找到。因此,密钥的删除也不会发生。 但是,当我通过双击从系统中执行此MSI时,会找到注册表项(在日志中,会记录“key exists!”并且也会被删除。
我的目的是删除它。

是的,msiexec.exe进程在系统帐户下运行,并且没有访问“当前用户”注册表配置单元的权限

实现这一点的一种可行方法是创建一个自定义操作,条件为“REMOVE~=ALL”,以便在卸载期间创建一个活动的安装密钥(用户必须注销并重新登录,活动安装才能运行一次)。请特别注意StubPath值:

Dim wshShell : Set wshShell = CreateObject( "WScript.Shell" )
Dim productCode : productCode = Session.Property("ProductCode")
wshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\" & productCode & "\", ""
wshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\" & productCode & "\Version", "1,0,0", "REG_SZ"
wshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\" & productCode & "\ComponentID", "Cleaning Mine Registry", "REG_SZ"
wshShell.RegWrite "HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\" & productCode & "\StubPath", "REG DELETE HKCU\Software\Mine /f", "REG_SZ"
Set wshShell = Nothing

我比较了以下两个日志:-Log1(在从系统手动运行MSI时生成)和Log2(在获取MSI并将其复制到系统然后执行时生成)。两者之间的主要区别是,在Log1中,LogonUser poperty的值是ashish.rana,这是我电脑上本地帐户的名称。在Log2中,LogonUser属性的值是SYSTEMYes,这意味着没有普通的
HKCU
配置文件可供访问,因为这是一台机器,而不是用户帐户。我想你可以尝试运行wi一个普通的管理员用户帐户,但HKCU的注册表项被视为“用户数据”,通常应留下-可能会有关于如何手动清除它们的说明。您只能为用户安装清理配置文件(一个用户)通过常规方法进行设置,因此您可以考虑在应用程序启动时进行任何清理,而不是在安装过程中进行清理。