質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

5368閲覧

MemoryMappedFileをWindowsアプリとWebアプリで共有したい

imudak

総合スコア40

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

1クリップ

投稿2018/10/24 09:48

編集2018/10/25 04:20

困っていること

MemoryMappedFileをWindowsアプリとWebアプリで共有しようとしています。

それぞれ単独で動かしたときには良いのですが、アプリ→Webの順に実行しようとすると
MemoryMappedFile.CreateOrOpenのところで、UnauthorizedAccessExceptionになります。

逆順に実行すると問題ないので最悪起動順に気をつければいいのですが、なぜ後からWebを実行するとダメなのか
原因がよくわかりません。

試した条件

  1. MyApp.exe:

・.NET Framework 4.7.2
・MyDll.dll参照
・管理者権限で実行

  1. MyWeb:

・Asp.NET Core 2.1
・.NET Framework 4.7.2
・MyDll.dll参照
・管理者権限で実行

  1. MyDll.dll:

・.NET Framework 4.7.2
・MemoryMappedFile作成、開くクラスが存在

MyDll.dll: MyApp.exe, MyWeb共通で呼び出しているメソッド

lang

1public void CreateOrOpenSharedMemory(string name, int capacity) { 2 var mmf = MemoryMappedFile.CreateOrOpen($@"Global\{name}", capacity); 3 var stream = mmf.CreateViewStream(); 4}

試した結果

結果1) MyApp.exe -> MyWebの順で実行。

System.UnauthorizedAccessException: パスへのアクセスは拒否されました。 場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 場所 System.IO.MemoryMappedFiles.MemoryMappedFile.CreateOrOpenCore(SafeFileHandle fileHandle, String mapName, HandleInheritability inheritability, MemoryMappedFileSecurity memoryMappedFileSecurity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, Int64 capacity) 場所 System.IO.MemoryMappedFiles.MemoryMappedFile.CreateOrOpen(String mapName, Int64 capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, MemoryMappedFileSecurity memoryMappedFileSecurity, HandleInheritability inheritability) 場所 System.IO.MemoryMappedFiles.MemoryMappedFile.CreateOrOpen(String mapName, Int64 capacity)

結果2) MyWeb -> MyApp.exeの順で実行

→問題なく起動、動作。

追記

コメントいただいたので追記します。
まさに業務で使おうとしています…

  1. WindowsAppが元々あり、MemoryMappedFileを使ったdllがあります。
  2. このWindowsAppの一部機能をWebApp化する要望があります。
  3. この一部機能を実現するためにMemoryMappedFileを使ったdllを使う必要があります。

MemoryMappedFileを使ったdllはとある情報を保持しており、この情報はWindowsAppからも
WebAppからも更新され共有する必要があります。

追記2' アクセス権追加

everyoneに権限を追加してみたところ、CreateOrOpen時の例外は回避されました。

lang

1MemoryMappedFileSecurity customSecurity = new MemoryMappedFileSecurity(); 2customSecurity.AddAccessRule( 3 new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>( 4 "everyone", MemoryMappedFileRights.FullControl, 5 System.Security.AccessControl.AccessControlType.Allow)); 6 7// m_MemoryMappedFile = MemoryMappedFile.CreateOrOpen(name, capacity); 8m_MemoryMappedFile = MemoryMappedFile.CreateOrOpen( 9 $@"Global\{name}", capacity, 10 MemoryMappedFileAccess.ReadWrite, 11 MemoryMappedFileOptions.None, 12 customSecurity, 13 System.IO.HandleInheritability.Inheritable);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/24 23:22

そもそもの目的はなんでしょうか? 自分の拙い経験の範囲ですが、そう言うことは聞いたこともないです。勉強のためとか技術的な興味という理由でなく、実際の運用上必要不可欠なのでしょうか? であれば、その辺りの事情を教えてください。
imudak

2018/10/25 01:02

ご質問ありがとうございます。追記いたしました。
退会済みユーザー

退会済みユーザー

2018/10/25 02:37

返答いただきありがとうございました。そういうことですと自分はアイデアは出せそうもないです。お役に立てずすみませんが、他の方の回答をお待ちください。
imudak

2018/10/25 02:38

こちらこそありがとうございました。dllが素直にDBに入れててくれればもう少し簡単だったのですが…
imudak

2018/10/25 04:21

参照しているdllが更新されていなかったため、追記2の結果を修正しました。
guest

回答2

0

みなさんありがとうございました。解決できました。

作成時に、IUSR,IIS_IUSRSにアクセス権を与えてればよいようです。
指定が面倒なら過剰ですが"everyone"でもよいようです。

lang

1MemoryMappedFileSecurity customSecurity = new MemoryMappedFileSecurity(); 2 3//customSecurity.AddAccessRule( 4// new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>( 5// "everyone", MemoryMappedFileRights.FullControl, 6// System.Security.AccessControl.AccessControlType.Allow)); 7customSecurity.AddAccessRule( 8 new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>( 9 "IIS_IUSRS", MemoryMappedFileRights.FullControl, 10 System.Security.AccessControl.AccessControlType.Allow)); 11customSecurity.AddAccessRule( 12 new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>( 13 "IUSR", MemoryMappedFileRights.FullControl, 14 System.Security.AccessControl.AccessControlType.Allow)); 15 16// m_MemoryMappedFile = MemoryMappedFile.CreateOrOpen(name, capacity); 17 18m_MemoryMappedFile = MemoryMappedFile.CreateOrOpen( 19 $@"Global\{name}", capacity, 20 MemoryMappedFileAccess.ReadWrite, 21 MemoryMappedFileOptions.None, 22 customSecurity, 23 System.IO.HandleInheritability.Inheritable)

ちなみに、読み書き時にMutexも使っていたので同様にアクセス権を付与します。

lang

1var mutex = new Mutex(false, $@"Global\{name}"); 2 3var security = new MutexSecurity(); 4security.AddAccessRule( 5 new MutexAccessRule("IUSR", MutexRights.FullControl, 6 AccessControlType.Allow)); 7security.AddAccessRule( 8 new MutexAccessRule("IIS_IUSRS", MutexRights.FullControl, 9 AccessControlType.Allow)); 10 11mutex.SetAccessControl(security);

投稿2018/10/25 05:16

imudak

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

System.UnauthorizedAccessExceptionの例外が発生している為、
MyApp.exe、MyWebのそれぞれを管理者権限で実行していたとしても、
MemoryMappedFile.CreateOrOpen()で作成されたMemoryMappedFileのアクセス権限が、
それぞれで違ったりしませんか?(MyWebの方がIIS_USERで弱いとか))

MemoryMappedFile.GetAccessControl()で権限を見ることが出来そうですが、
触ったことがない為、サンプルとか提示できません。

投稿2018/10/25 01:04

sugar_yas

総合スコア135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imudak

2018/10/25 02:35

GetAccessControl() Debugで見てみたのですが、いまいちよくわからずです…MemoryMappedFileSecurityを緩めに設定してCreateOrOpen()か、SetAccessControl()で渡してやれば良さそうなのですが、なにを渡せばゆるくなるのか調べているところです。
imudak

2018/10/25 05:19

手がかりになりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問