- - PR -
IPC通信サービスをうまくつくれません
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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-04-01 16:27
自己解決いたしましたのでご報告申し上げます。
今回の原因はACLの不適切な設定にあったようです。 クライント側の実行権は実行ユーザーと権限と同じになるため、Adminにったため、 IPC通信へのアクセスは正常に行われました。 クライアントの動作により、サーバー側がIPC通信の共通オブジェクトへの参照が発生したが、アクセス権がないため、このような事象が発生してしまったようです。 解決策 今回はwindowsサーバーアプリケーション作成時に実行権をLocalServiceにしたためにアクセス権がありませんでした。 そこで、LocalServiceの実行権をサーバーがわのアプリケーションに付与しました。 これで解決いたしました。 閲覧していただきありがとうございました。 |
1