虚假功能“已广告”状态导致卸载错误1316

时间:2019-07-14 15:10:44

标签: wix windows-installer

症状

用户有时在卸载过程中通过添加/删除程序(或“应用和功能”设置应用)获得以下错误消息之一:

  •   

    错误1316。指定的帐户已经存在。

  •   

    错误1316。尝试从网络中读取时发生网络错误。   文件:C:\ WINDOWS \ Installer \ NameOfOriginalSetup .msi

实际上,这两个错误完全相同,仅当安装了KB2918614(也称为“安全修复”补丁)且产品未列入白名单时,才会显示第一条消息。只是在这种情况下,错误代码被误解为一般的system error而不是actual MSI error。否则,KB2918614无关紧要。

  •   

    错误1406。无法将值写入key。确认您具有对该密钥的足够访问权,或与支持人员联系。

似乎不太常见。由于消息框中包含一个“忽略”按钮,无论如何该按钮都可以继续进行卸载,因此用户不太可能报告此错误。

日志文件

通过msiexec -x {ProductCode} -l*vx LogFile.txt获得了卸载日志文件。搜索“值3”会产生错误位置附近的部分:

MSI (s) (B0:9C) [15:18:10:427]: Executing op: FeatureUnpublish(Feature=ProductFeature,,Absent=2,Component=iJm4+0tc4@uTvD')YKUXZ{NA8`o569(2MdBLg[rJ)
MSI (s) (B0:9C) [15:18:10:428]: Note: 1: 1402 2: UNKNOWN\Installer\Features\AFCEC7274CC7C0441A85705C47554DD5 3: 2 
MSI (s) (B0:9C) [15:18:10:428]: Executing op: ActionStart(Name=InstallFiles,Description=Copying new files,Template=File: [1],  Directory: [9],  Size: [6])
MSI (s) (B0:9C) [15:18:10:428]: Executing op: ProgressTotal(Total=5,Type=0,ByteEquivalent=1)
MSI (s) (B0:9C) [15:18:10:428]: Executing op: SetTargetFolder(Folder=C:\Program Files\zett42\SpuriousFeatureAdvTest1\)
MSI (s) (B0:9C) [15:18:10:428]: Executing op: SetSourceFolder(Folder=1\zett42\xipmcfby\|zett42\SpuriousFeatureAdvTest1\)
MSI (s) (B0:9C) [15:18:10:428]: Executing op: ChangeMedia(,MediaPrompt=Please insert the disk: ,MediaCabinet=1\cab1.cab,BytesPerTick=65536,CopierType=1,,,SignatureRequired=0,,,IsFirstPhysicalMedia=1)
MSI (s) (B0:9C) [15:18:10:428]: Executing op: RegisterSharedComponentProvider(,,File=File2.txt,Component={3F28EEDB-866D-4201-8173-12532C657B6C},,ProductCode={727CECFA-7CC4-440C-A158-07C57455D45D},ProductVersion=1.0.0,PatchSize=0,PatchAttributes=0,PatchSequence=0,SharedComponent=0,IsFullFile=0)
MSI (s) (B0:9C) [15:18:10:428]: Executing op: FileCopy(SourceName=File2.txt,SourceCabKey=File2.txt,DestName=File2.txt,Attributes=512,FileSize=5,PerTick=65536,,VerifyMedia=1,,,,,CheckCRC=0,,,InstallMode=58982400,HashOptions=0,HashPart1=1397189395,HashPart2=108432067,HashPart3=-1009892414,HashPart4=374579663,,)
MSI (s) (B0:9C) [15:18:10:428]: File: C:\Program Files\zett42\SpuriousFeatureAdvTest1\File2.txt;    To be installed;    Won't patch;    No existing file
MSI (s) (B0:9C) [15:18:10:428]: Resolving source.
MSI (s) (B0:9C) [15:18:10:428]: Using cached product context: machine assigned for product: AFCEC7274CC7C0441A85705C47554DD5
MSI (s) (B0:9C) [15:18:10:428]: Using cached product context: machine assigned for product: AFCEC7274CC7C0441A85705C47554DD5
MSI (s) (B0:9C) [15:18:10:429]: Resolving source to launched-from source.
MSI (s) (B0:9C) [15:18:10:429]: Setting launched-from source as last-used.
MSI (s) (B0:9C) [15:18:10:429]: PROPERTY CHANGE: Adding SourceDir property. Its value is 'C:\WINDOWS\Installer\'.
MSI (s) (B0:9C) [15:18:10:429]: PROPERTY CHANGE: Adding SOURCEDIR property. Its value is 'C:\WINDOWS\Installer\'.
MSI (s) (B0:9C) [15:18:10:429]: PROPERTY CHANGE: Adding SourcedirProduct property. Its value is '{727CECFA-7CC4-440C-A158-07C57455D45D}'.
MSI (s) (B0:9C) [15:18:10:429]: SOURCEDIR ==> C:\WINDOWS\Installer\
MSI (s) (B0:9C) [15:18:10:429]: SOURCEDIR product ==> {727CECFA-7CC4-440C-A158-07C57455D45D}
MSI (s) (B0:9C) [15:18:10:429]: Using cached product context: machine assigned for product: AFCEC7274CC7C0441A85705C47554DD5
MSI (s) (B0:9C) [15:18:10:429]: Determining source type
MSI (s) (B0:9C) [15:18:10:429]: Note: 1: 2203 2: C:\WINDOWS\Installer\SpuriousFeatureAdvTest1.msi 3: -2147287038 
MSI (s) (B0:9C) [15:18:10:429]: Note: 1: 1316 2: C:\WINDOWS\Installer\SpuriousFeatureAdvTest1.msi 
MSI (s) (B0:9C) [15:18:10:429]: SECREPAIR: Error determining package source type
MSI (s) (B0:9C) [15:18:10:429]: SECUREREPAIR: SecureRepair Failed. Error code: 524FD15800
MSI (s) (B0:9C) [15:18:11:146]: Note: 1: 2205 2:  3: Error 
MSI (s) (B0:9C) [15:18:11:146]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1709 
MSI (s) (B0:9C) [15:18:11:146]: Product: zett42 SpuriousFeatureAdvTest1 -- Error 1316. Das angegebene Konto ist bereits vorhanden.


MSI (c) (C4:38) [15:18:10:436]: Font created.  Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg

Error 1316. Das angegebene Konto ist bereits vorhanden.

(最后一个日志行是德语中的“指定的帐户已经存在。”)

从日志中可以看出,卸载尝试将文件“ File2.txt”实际上复制到硬盘(查找FileCopy条目)。这似乎没有意义,当然,当源不可用时,它也会失败。

特征和组件状态也很有趣,它们会在日志中进一步显示出来:

MSI (s) (B0:9C) [15:18:10:387]: Feature: ProductFeature; Installed: Advertise;   Request: Absent;   Action: Absent
MSI (s) (B0:9C) [15:18:10:387]: Component: File1; Installed: Absent;   Request: Null;   Action: Null;   Client State: Unknown
MSI (s) (B0:9C) [15:18:10:387]: Component: File2; Installed: Local;   Request: Null;   Action: Local;   Client State: Absent

请注意,功能“ ProductFeature”的状态为“ 已安装:广告”,尽管该功能是在本地安装的。组件“ File2”的“ 操作:本地”与我们在日志中看到的匹配,即Windows Installer希望在卸载过程中在本地安装文件 !同样,这对我来说毫无意义。

注册表缺陷

我发现在问题机器上,缺少无法卸载的产品的随机组件注册表项:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\<ComponentKey>

手动添加缺少的注册表项(包括来自全新安装状态的所有值)后,可以成功卸载产品。

事实证明,当缺少任何组件注册表项时,Windows Installer会将包含这些组件的功能的状态确定为“播发”。这仍然不足以导致卸载时出现错误1316。实际上,只有磁盘上物理上缺少组件文件时,Windows Installer才会触发尝试进行本地复制的操作。

最小示例和复制步骤

我还不能“自然地”重现问题,即e。就像在客户计算机上发生的一样。只有手动删除上述组件注册表项之一,我才能人为地重现该问题。

  1. 构建一个最小的WiX设置,以安装两个文件“ File1.txt”和“ File2.txt”:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?define ProductName = "SpuriousFeatureAdvTest1"?>
  <?define Manufacturer = "zett42"?> 
  <?if $(var.Platform) = x64 ?>
    <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
  <?else ?>
    <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
  <?endif ?>

  <Product Id="*" Name="$(var.Manufacturer) $(var.ProductName)" Language="1033" Version="1.0.0.0" Manufacturer="$(var.Manufacturer)" UpgradeCode="{65CEA630-EFC0-4199-86EE-88867AABEDEF}">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of $(var.ProductName) is already installed." />
    <MediaTemplate />

    <Feature Id="ProductFeature" Title="$(var.ProductName)" Level="1" AllowAdvertise="no" >
        <ComponentGroupRef Id="ProductComponents" />
    </Feature>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
        <Directory Id="MANUFACTURERFOLDER" Name="$(var.Manufacturer)">
          <Directory Id="INSTALLFOLDER" Name="$(var.ProductName)" />
        </Directory>
      </Directory>
    </Directory>

    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <Component Id="File1" Guid="{19819F06-DD45-4B48-BD00-810DEF7C0297}">
        <File Source="File1.txt"/>
      </Component>
      <Component Id="File2" Guid="{3F28EEDB-866D-4201-8173-12532C657B6C}">
        <File Source="File2.txt"/>
      </Component>
    </ComponentGroup>  
  </Product>
</Wix>
  1. 安装MSI文件。

  2. 删除属于组件“ File1”的以下注册表项:

    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\60F9189154DD84B4DB0018D0FEC72079
    
  3. 删除一个密钥文件,该文件属于同一功能的任何 other 组件,在本例中为“ File2”:

    c:\Program Files\zett42\SpuriousFeatureAdvTest1\File2.txt
    
  4. 尝试通过“添加/删除程序”或“应用和功能”来卸载产品。

  5. 卸载失败,并显示“错误1316”消息。

尝试的解决方案/解决方法

获得支持:Microsoft Program Install and Uninstall troubleshooter成功删除了有问题的产品。

我曾尝试禁用广告功能<Feature AllowAdvertise="no"/>),但它没有任何改变。

问题

该问题可能是什么原因以及如何实际解决?

  • 违反设置中的组件规则。尽管我不能排除此原因,但似乎不太可能,因为缺少的组件注册表项是随机的,并且仅影响一小部分用户。
  • 对第三方软件(例如AV或注册表清理实用程序)的干扰。
  • 磁盘或内存故障。
  • 在Windows Installer中错误。
  • 还有什么?

搜索错误消息表明问题很普遍。在some cases中,该错误是由在次要升级期间更改MSI的文件名引起的。在这里绝对不是这种情况,因为我们不做较小的升级并且有问题的设置的MSI文件没有重命名。如上所述,很明显,存在注册表缺陷here中描述了一个可能类似的情况,但是答案没有任何解释,仅指向MS故障排除工具。

1 个答案:

答案 0 :(得分:0)

我已经能够使用注册表清理器重现该问题。

复制步骤:

  1. 使用Windows Installer安装程序。
  2. 从程序文件夹中删除一个或多个作为其组件密钥文件的文件。
  3. 运行注册表清理程序。清理程序错误地确定不再需要Windows Installer组件注册表项(其密钥文件不存在)。清理程序删除注册表项。
  4. 从程序文件夹中删除更多文件,这些文件是其组件的密钥文件。
  5. 尝试卸载该程序。它失败并显示错误1316。

即使没有第4步,此卸载也将被破坏,因为由相同功能的组件(包含已删除的组件)安装的任何其他资源都不会被卸载。删除一个组件注册表项,整个功能将不再被卸载!

在第4步中,问题变成一个问题,因为整个卸载将回滚。当卸载作为主要升级的一部分运行而需要首先删除旧版本时,它也可能会导致安装问题。

尽管这些步骤看起来有些人为,但用户从程序安装文件夹中手动删除文件肯定不是不可能。当程序安装在可移动磁盘上并且清洁器在磁盘移除后运行时,这也可能会意外发生。可以想到其他原因。

解决方案:

  • 请勿使用注册表清理程序。尽管有些可能确实有效,但总会有它们破坏某些东西的风险。
  • 如果在卸载任何程序的过程中发生错误1316或1406(可能在大型升级过程中,当删除旧版本时),请在“卸载”模式下使用Microsoft Program Install and Uninstall troubleshooter。在某些情况下,您还可以通过重新运行用于安装程序的原始安装程序包来获得成功。