OpenXML,IsolatedStorage,NETWORK SERVICE和Windows Server 2008

时间:2011-07-13 12:53:27

标签: c# windows-server-2008 openxml isolatedstorage

我有一个大型的Web应用程序。这个Web应用程序的一小部分使用OpenXML库(用C#编写)生成XLSX文件。

我遇到了这篇文章中描述的问题:IsolatedStorage Access Denied

但是,有关Windows Server 2003的说明,而2008年的用户目录层次结构不同。

我尝试在这些位置创建IsolatedStorage目录(然后为其提供NETWORK SERVICE权限):

C:\用户\默认\应用程序数据\本地\ IsolatedStorage C:\ Users \用户默认\应用程序数据\漫游\ IsolatedStorage

那些没用。我试图找到IsolatedStorage目录的适当位置在Windows Server 2008上的位置(通常使用Google,特别是在这里),但没有成功。

任何人都可以告诉我应该在哪里创建该目录(或者,建议其他一些解决方案会强制OpenXML指示存档库不使用IsolatedStorage来创建电子表格)?

编辑 - 2011年7月14日 - 添加异常消息和堆栈跟踪,以便有希望帮助其他人找到它。

Exception: System.ApplicationException
Message: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
Source: mscorlib
   at System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.Init(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.GetStore(IsolatedStorageScope scope, Type domainEvidenceType, Type assemblyEvidenceType)
   at MS.Internal.IO.Packaging.PackagingUtilities.ReliableIsolatedStorageFileFolder..ctor()
   at MS.Internal.IO.Packaging.PackagingUtilities.GetDefaultIsolatedStorageFile()
   at MS.Internal.IO.Packaging.PackagingUtilities.CreateUserScopedIsolatedStorageFileStreamWithRandomName(Int32 retryCount, String& fileName)
   at MS.Internal.IO.Packaging.SparseMemoryStream.EnsureIsolatedStoreStream()
   at MS.Internal.IO.Packaging.SparseMemoryStream.SwitchModeIfNecessary()
   at MS.Internal.IO.Zip.ZipIOFileItemStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.Compression.DeflateStream.InternalWrite(Byte[] array, Int32 offset, Int32 count, Boolean isAsync)
   at System.IO.Compression.DeflateStream.Write(Byte[] array, Int32 offset, Int32 count)
   at MS.Internal.IO.Packaging.CompressStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at MS.Internal.IO.Zip.ProgressiveCrcCalculatingStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at MS.Internal.IO.Zip.ZipIOModeEnforcingStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.Xml.XmlUtf8RawTextWriter.FlushBuffer()
   at System.Xml.XmlUtf8RawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd)
   at System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
   at System.Xml.XmlWellFormedWriter.WriteString(String text)
   at DocumentFormat.OpenXml.OpenXmlElement.WriteAttributesTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlElement.WriteTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlCompositeElement.WriteContentTo(XmlWriter w)
   at DocumentFormat.OpenXml.OpenXmlElement.WriteTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlCompositeElement.WriteContentTo(XmlWriter w)
   at DocumentFormat.OpenXml.OpenXmlElement.WriteTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlCompositeElement.WriteContentTo(XmlWriter w)
   at DocumentFormat.OpenXml.OpenXmlPartRootElement.WriteTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlPartRootElement.SaveToPart(OpenXmlPart openXmlPart)
   at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.SavePartContents()
   at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Dispose(Boolean disposing)
   at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Close()

2 个答案:

答案 0 :(得分:4)

在我的研究期间,我偶然发现了这篇博文:http://www.kevinrohrbaugh.com/blog/tag/openxml

我首先解雇了它,因为我不可能让我的应用程序模仿另一个用户,因为它与我无法控制的另一个Web应用程序进行交互。

但是,我想到也许我在ProfileList中删除了NETWORK SERVICE的注册表项,我可以得到相同的结果。

因此,我将HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList \ S-1-5-20重命名为HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList \ S-1-5-20-backup并重新运行我的Excel导出,它正常工作。据我所知,这样做没有任何负面结果。

答案 1 :(得分:0)

[我会将此作为评论添加,但我没有获得许可......]

我希望这有助于其他人...

我在IIS Express中运行的应用程序作为Windows Server 2008 R2上的网络服务。从调用IsolatedStorageFile.GetMachineStoreForDomain()返回的独立存储库位于:c:\ ProgramData \ IsolatedStorage