IsolatedStorageException:ストアディレクトリを作成できません
-
10-07-2019 - |
質問
こんにちは、私はいくつかの隠された情報を隔離されたスペースに保存しなければなりません。そのために私はSystem.IO.Isolatedクラスを使用しています
IsolatedStorageFile isf = System.IO.IsolatedStorage.IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
Stream writer = new IsolatedStorageFileStream(filename, FileMode.Create, isf);
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(writer, appCollection.ToString());
writer.Close();
Windows XPでは正常に動作しますが、Windows 2003である運用サーバーでは例外が表示されます
System.IO.IsolatedStorage.IsolatedStorageException:ストアディレクトリを作成できません。
asp.netプロジェクトフォルダにEveryoneフルコントロールのアクセス許可があります。 CSoft.Coreは私が作成した個人的なフレームワークです。
これは私のスタックトレースです:
[IsolatedStorageException:ストアディレクトリを作成できません。 (HRESULTからの例外:0x80131468)]
System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir(IsolatedStorageScope スコープ)+0
System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser(IsolatedStorageScope スコープ)+97
System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir(IsolatedStorageScope スコープ)+137
System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm(IsolatedStorageScope スコープ)+213
System.IO.IsolatedStorage.IsolatedStorageFile.Init(IsolatedStorageScope スコープ)+56
System.IO.IsolatedStorage.IsolatedStorageFile.GetStore(IsolatedStorageScope scope、Type domainEvidenceType、Type assemblyEvidenceType)+59
CSoft.Core.IO.StorageHelper.Save(String fileName、String content)in c:\ Projectos \ FrameworkCS \ CSoft.Core \ IO \ StorageHelper.cs:18
CSoft.Web.UI.ViewStateHelper.SerializeViewState(HttpContextコンテキスト、 オブジェクト状態) c:\ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs:65 CSoft.Web.UI.Page.SavePageStateToPersistenceMedium(Object state)in c:\ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ Page.cs:302
System.Web.UI.Page.SaveAllState()+236
System.Web.UI.Page.ProcessRequestMain(ブール includeStagesBeforeAsyncPoint、ブールincludeStagesAfterAsyncPoint) +1099
解決 3
IsolatedStorageファイルを
に変更しましたusing(IsolatedStorageFile isoStore = IsolatedStorageFile.GetMachineStoreForAssembly()) {}
そしてこれは動作します。
他のヒント
このユーザーはすでに問題を解決していることは知っていますが、答えを探している他のユーザーにとっては。この投稿は完璧ではありませんが、この問題を解決するために必要なものを示しています。
asp.netを使用すると、GetMachineStoreForAssemblyはほとんどの場合に機能するようであり、Webアプリから分離ストレージを使用する場合におそらく望ましいモードです。 GetUserStoreForAssemblyを使用する場合でも、asp.netアプリを実行しているユーザーアカウントによって分離され、各ログインをWindowsユーザーに何らかの方法でマッピングしない限り、各Webサイトユーザーに対して常に同じであるためです。これを行うと動作します)。
問題は、隔離されたストレージに対する権限を持つユーザーが必要なため、GetUserStoreForAssemblyを使用しようとすることです。アプリケーションのデフォルトのIISユーザーは、この権限を取得できません。
2つの解決策があります:
-
GetMachineStoreForAssemblyを使用
-
GetUserStoreForAssemblyを使用する必要がある場合、権限を持つユーザーとして実行するようにアプリを設定します。これは、フォルダーのアクセス許可では解決されません。セキュリティ設定を取得する方法はいくつかあります。(IIS7)アプリプールで設定するか、基本設定で設定できます> [別のユーザーとして接続]または[認証]>匿名認証。ユーザーが必要とする権利が正確にはわかりませんが、これにより正しい方向に進むことができます。
問題の把握に役立つボーナスコードを次に示します。
Dim storageFile As IsolatedStorageFile
If Request("storage") = "user" Then
storageFile = IsolatedStorageFile.GetUserStoreForAssembly()
Else
storageFile = IsolatedStorageFile.GetMachineStoreForAssembly()
End If
Response.Write(storageFile.GetType.GetField("m_RootDir", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance).GetValue(storageFile).ToString())
GetUserStoreForAssemblyは次のとおりです。 C:\ Documents and Settings \ Gabe \ Local Settings \ Application Data \ IsolatedStorage \
GetMachineStoreForAssemblyは次のとおりです。 C:\ Documents and Settings \ All Users \ Application Data \ IsolatedStorage \
IISで実行されており、アプリケーションプールIDがNetworkServiceの場合、アプリケーションプールの詳細設定に移動して、「ユーザープロファイルの読み込み」を設定することができます。値を" True"にします。私のために働いた。
サーバーでこれをどのように実行していますか?サーバー上でサービスとして実行している場合、サービスの実行に割り当てられているユーザーに問題がある可能性があります。本番サーバーで使用しているのと同じユーザーでテストしてください。
John Saundersがコメントで尋ねているように、可能であれば例外をスローする行を含め、スタックトレースの詳細を投稿してください。
ただし、いくつかのサイキックデバッグスキル、ここで役立つかもしれないいくつかの野生の刺しを取るつもりです:
- IsolatedStorageExceptionは、 GetStore と IsolatedStorageFileStream コンストラクタ
- " Windows XPで正常に動作します" -(おそらく管理者の)資格情報の下で実行されているWebサーバーに組み込まれているVisual Studioでサイトを実行しますが、プロファイルを持つユーザーとして、したがって分離ストレージフォルダーとして実行します。
- "しかし、本番環境では例外がスローされます" -「ネットワークサービス」のいずれかで実行されている場合またはプロファイルを持たない他のアカウント、またはデスクトップタイプの権利との対話(詳細は不明-主にキラーとなるプロファイルの欠如)。
サイトはどのような種類のアカウントで運用されていますか?サーバーにログオンしてファイルシステムと適切に対話できるのはユーザーではないと思いますか?