如何访问/什么是SYSTEM帐户下Windows服务的WiX CommonAppDataFolder参数

时间:2019-05-16 13:04:57

标签: excel visual-studio-2013 wix

我有一个Windows服务,该服务需要在SYSTEM帐户下运行。我使用CommonAppDataFolder作为应用程序特定的配置内容和源材料(例如日志文件,Excel模板文件等)的目的地。该服务可以正确安装并运行,但是在尝试加载Excel模板文件时遇到问题,以下内容表明该服务能够访问和写入日志文件。该应用程序使用NLog作为日志记录框架:

应用程序名称:AppName文件版本:5.2.0.0发布:用户:NT AUTHORITY \ SYSTEM | 12:24:59 | NT AUTHORITY \ SYSTEM | Info | AppName-已启动的AppName服务 2 | 12:24:59 | NT AUTHORITY \ SYSTEM | Trace | AppName-从配置文件中获取RTU警报名称 3 | 12:24:59 | NT AUTHORITY \ SYSTEM | Trace | AppName-从配置文件中获取条件警报名称 4 | 12:25:23 | NT AUTHORITY \ SYSTEM | Debug | AppName-获取预定的查询

日志文件位于:

D:\ programdata \ Companyname \ AppName \ Logs

但是,当服务尝试访问Excel模板文件时,它会生成:

System.Runtime.InteropServices.COMException(0x800A03EC):Microsoft Excel无法访问文件“ d:\ programdata \ CompanyName \ AppName \ Templates \ PsaDefault.xltm”。有几种可能的原因:

•文件名或路径不存在。

•该文件正在被另一个程序使用。

•您要保存的工作簿与当前打开的工作簿具有相同的名称。

这些都不是原因。此后,我立即想到的是,好吧……SYSTEM帐户的commonappdata位于不同的位置,并且对此问题进行了快速的搜索。但是,如果是这种情况,该服务如何写入和访问完全相同的文件夹结构下的日志文件?

有没有一种方法可以修改我的WiX项目,以提供必要的说明来覆盖可能的“已登录用户” / SYSTEM 帐户冲突,或者将文件夹结构更改为SYSTEM帐户不会遇到此问题的位置。 SYSTEM帐户是否具有等效的WiX参数?还是我对这个问题的假设完全错了?

以下是我的product.wxs文件的摘录(GUID,公司和应用程序特定的信息已被占位符覆盖):

  <!-- The following section deals with the deployment of the application data files including logs, templates and userguide elements-->
  <Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="CommonAppDataFolder" Name="CommonAppData" >
      <Directory Id="dirCompanyAppData" Name="CompanyName">
        <Directory Id="dirAppNameAppData" Name="AppName">
          <Component Id="cmpDirAppNameAppData" Guid="{###}" KeyPath="yes">
            <CreateFolder Directory="dirAppNameAppData" />
            <RemoveFile Id="PurgeAppnameAppData" Name="*.*" On="uninstall" />
            <RemoveFolder Id="idDirAppNameAppData" On="uninstall" Directory="dirAppNameAppData" />
          </Component>
          <Directory Id="dirAppNameAppDataOutput" Name="Output">
            <Component Id="cmpDirAppNameAppDataOutput" Guid="{###}">
              <CreateFolder Directory="dirAppNameAppDataOutput" />
              <RemoveFile Id="PurgeAppNameAppDataOutput" Name="*.*" On="uninstall" />
              <RemoveFolder Id="idDirAppNameAppDataOutputRemove" On="uninstall" Directory="dirAppNameAppDataOutput" />
            </Component>
          </Directory>

1 个答案:

答案 0 :(得分:0)

  

建议 :简而言之,将模板移至 %ALLUSERSPROFILE% 下的某个位置。


  

文件/文件夹ACL :用户的实际ACL设置   配置文件文件夹本身可能是原因。你能跑吗   从 %ALLUSERSPROFILE% 下的某个地方?默认情况下应该可写吗?

     

在现代Windows系统上,通常映射到:    C:\ProgramData (在其他地方的旧系统上)。我认为 SYSTEM 帐户应该在此处具有完全访问权限?试试吧?


  

测试路径 :要测试该路径: Windows键 +点击 R 。粘贴 %ALLUSERSPROFILE% ,然后按确定

     

也:打开 cmd.exe 并转到“ set ”(不带引号)以查看环境变量及其值。会有所帮助。只是为了方便而添加(众所周知)。


DCOM权限 :COM服务器具有关联的启动权限。一些工具和注释可帮助您调试:

  • 默认 :在 comexp.msc 中设置了一些默认的 DCOM 权限。

    • 启动: Windows键 +点击 R 。粘贴 comexp.msc ,然后按确定
    • 右键单击My Computer => Properties => COM-Security
    • 我对这些设置没有太多关注。灵活多变,有意义的几件事?
  • 特定 :注册表中还可以为每个COM类设置特定的权限。也许使用 oleview.exe (或直接使用 regedit.exe )进行检查?

    • 在Windows SDK文件夹中找到 oleview.exe 。在以下位置搜索磁盘: %ProgramFiles(X86)%\Windows Kits\[SDK-VERSION-NUMBER-HERE]\bin
    • 找到您的班级(以下示例: Scripting.Dictionary )。请参见 "Launch Permissions" "Access Permissions" 标签。

    oleview.exe

我不记得在这里看到过许多Office应用程序的自定义设置,我可能是错的。我目前没有Office要测试。