2011-12-05 46 views
2

私はプログラム間ダイアログ用にMailslots(Delphi 7)を使用していますが、すべてOKです。WindowsサービスプログラムのMailslotの書き込み時に「アクセスが拒否されました」

Windowsのサービスとして自分のプログラム(Windows XP)を使用すると、別の(古典的な管理者の)プログラムがメールスロットに書き込もうとすると、「メールスロットアクセスが拒否されました」というメッセージが表示されます。 私は、サービスにはシステム権限があるので確かに権利問題であると理解していますが、解決策は何ですか?

+1

サービスまたはアプリケーションのメールスロットは誰が作成していますか? 'CreateMailslot()'の 'lpSecurityAttributes'パラメータにはどのようなセキュリティ属性が指定されていますか?サービスを扱うときには大きな違いがあります。サービスがメールスロットを作成している場合は、メールスロットへの匿名アクセスを許可するNULLでない 'SECURITY_ATTRIBUTES'オブジェクトを割り当てる必要があります。 –

+0

@ RemyLebeau-TeamBいいえ、サービスはMailSlotを作成します。私は今lpSecurityAttributesを参照しています。私のアプリケーションではゼロです。私はそれを非Nullオブジェクトに割り当てる方法を見ています... – philnext

+0

私の答えを見てください。私はコードスニペットを提供しました。 –

答えて

2

CreateMailslot()を呼び出し、例えば、メールスロットへのすべてのアクセスを可能にSECURITY_DESCRIPTORを指定:

var 
    ... 
    sd: SECURITY_DESCRIPTOR; 
    sa: SECURITY_ATTRIBUTES; 
begin 
    ... 
    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION); 
    SetSecurityDescriptorDacl(@sd, True, nil, False); 

    sa.lpSecurityDescriptor := @sd; 
    sa.bInheritHandle := Frue; 

    ... := CreateMailslot(..., @sa); 
    ... 
end; 
+0

優れた&明確な答え。 – philnext

2

を私はC++ Embarcardero 2010を使用して、私はCreateMailSlot機能するのでRemy Lebeauの溶液にいくつかの変更を行う必要がありますタイプSECURITY_ATTRIBUTES *のポインターを受け取り、タイプSECURITY_DESCRIPTOR *のポインターは受け取りません。

C++での私のソリューションです:

SECURITY_DESCRIPTOR sd; 
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 
SetSecurityDescriptorDacl(&sd, true, NULL, false); 

SECURITY_ATTRIBUTES sa; 
sa.lpSecurityDescriptor=&sd; 
sa.bInheritHandle=true; 
this->pHandleMailSlot = CreateMailslot("your mail slot path", 0, -1, &sa); 

注:

  1. メールスロット(EmbarcaderoのC++ 2010)
  2. とサービス:私の場合は、3つのアプリケーションをしましたクライアントメールスロットを持つサービス(.NET v4)
  3. クライアントメールスロットを持つWPF(.NET v4)
+0

実際に生成されたプロセスがハンドルを継承する必要がない限り、代わりに 'sa.bInheritHandle'をfalseに設定します。 –

関連する問題