- PR -

IPC通信サービスをうまくつくれません

1
投稿者投稿内容
あかり
常連さん
会議室デビュー日: 2009/02/18
投稿数: 38
投稿日時: 2009-03-04 14:13
IPC通信サービスを作成し、サービススタート時にサーバーチャネルを登録して、クライアントアプリケーションで使用したいのですが、うまくサービスを動作させることができません、どのようにすればよいのでしょうか?

Windowsアプリケーションでは正常に動作するのですが、サービスにしたことで、共有オブジェクトに対するアクセス権の問題が発生しているのでしょうか?

サービスはOnStartとOnStop以外に処理は記述していません。

Windowsサービスにすると、クライアントが共有オブジェクトにアクセスした直後サービス側がIPCポートへ接続できませんアクセスが拒否されましたとエラーが出てしまいます。


サーバーほかに
Protected Overrides Sub OnStart(ByVal args() As String)
Try
'ACL
' Local administrators sid
Dim localAdminSid As New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing)
' Local Power users sid
Dim powerUsersSid As New SecurityIdentifier(WellKnownSidType.BuiltinPowerUsersSid, Nothing)

Dim dacl As New DiscretionaryAcl(False, False, 1)

' Allow acces only from local administrators and power users
dacl.AddAccess(AccessControlType.Allow, localAdminSid, -1, InheritanceFlags.None, PropagationFlags.None)
dacl.AddAccess(AccessControlType.Allow, powerUsersSid, -1, InheritanceFlags.None, PropagationFlags.None)

Dim securityDescriptor As New CommonSecurityDescriptor(False, False, ControlFlags.GroupDefaulted Or ControlFlags.OwnerDefaulted Or ControlFlags.DiscretionaryAclPresent, Nothing, Nothing, Nothing, dacl)

'// サーバチャネル生成
'// チャネル登録
Dim props As Hashtable = New Hashtable()
props("portName") = PipeName
Server_channel = New IpcServerChannel(props, Nothing, securityDescriptor)
ChannelServices.RegisterChannel(Server_channel, True)
RegisterWellKnownServiceType(GetType(Develop.Develop.IPC.RemoteObject), GetType(Develop.Develop.IPC.RemoteObject).Name, Runtime.Remoting.WellKnownObjectMode.SingleCall)

Catch ex As Exception

End Try
End Sub

クライアント側
Try
'// チャネル登録
Client_channel = New IpcClientChannel
ChannelServices.RegisterChannel(Client_channel, True)

Dim obj As Object = Activator.GetObject(GetType(RemoteObject), "ipc://" & PipeName & "/" & ObjectUri)
mRemoteObject = CType(obj, RemoteObject)
Catch ex As Exception
ret = Develop.ErrorColection.ErrNumbers.Err_IPC_Init
If ErrorOutMode Then
Develop.ErrorColection.ErrorPutFile(ex.ToString)
End If
End Try
あかり
常連さん
会議室デビュー日: 2009/02/18
投稿数: 38
投稿日時: 2009-04-01 16:27
自己解決いたしましたのでご報告申し上げます。

今回の原因はACLの不適切な設定にあったようです。

クライント側の実行権は実行ユーザーと権限と同じになるため、Adminにったため、
IPC通信へのアクセスは正常に行われました。
クライアントの動作により、サーバー側がIPC通信の共通オブジェクトへの参照が発生したが、アクセス権がないため、このような事象が発生してしまったようです。

解決策
今回はwindowsサーバーアプリケーション作成時に実行権をLocalServiceにしたためにアクセス権がありませんでした。
そこで、LocalServiceの実行権をサーバーがわのアプリケーションに付与しました。
これで解決いたしました。

閲覧していただきありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)