我有一个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>
答案 0 :(得分:0)
建议 :简而言之,将模板移至
%ALLUSERSPROFILE%
下的某个位置。
文件/文件夹ACL :用户的实际ACL设置 配置文件文件夹本身可能是原因。你能跑吗 从
%ALLUSERSPROFILE%
下的某个地方?默认情况下应该可写吗?在现代Windows系统上,通常映射到:
C:\ProgramData
(在其他地方的旧系统上)。我认为SYSTEM
帐户应该在此处具有完全访问权限?试试吧?
测试路径 :要测试该路径: Windows键 +点击 R 。粘贴
%ALLUSERSPROFILE%
,然后按确定。也:打开
cmd.exe
并转到“set
”(不带引号)以查看环境变量及其值。会有所帮助。只是为了方便而添加(众所周知)。
DCOM权限 :COM服务器具有关联的启动权限。一些工具和注释可帮助您调试:
默认 :在 comexp.msc
中设置了一些默认的 DCOM 权限。
comexp.msc
,然后按确定。My Computer
=> Properties
=> COM-Security
。 特定 :注册表中还可以为每个COM类设置特定的权限。也许使用 oleview.exe
(或直接使用 regedit.exe
)进行检查?
oleview.exe
。在以下位置搜索磁盘: %ProgramFiles(X86)%\Windows Kits\[SDK-VERSION-NUMBER-HERE]\bin
。Scripting.Dictionary
)。请参见 "Launch Permissions"
和 "Access Permissions"
标签。我不记得在这里看到过许多Office应用程序的自定义设置,我可能是错的。我目前没有Office要测试。