2014-01-15 6 views
0

IPC 채널을 여러 클라이언트에서 사용하는 .NET Remoting 서버가 있습니다. 관리자 만 파이프에 액세스 할 수 있도록 서버 끝을 설정해야합니다. 서버 채널에 "authorizedGroup"속성이 있다는 것을 알고 있습니다.IPC 채널 권한이 부여 된 그룹

설정하지 않은 경우 서버와 클라이언트가 동일한 계정 (확인)을 사용하는 태양인 경우에만 통신 할 수 있습니다. "Users"(영어 버전의 Windows 사용)로 설정하면 LocalSystem에서 서버를 실행할 수 있으며 다른 사용자가 실행중인 클라이언트는 연결할 수 있습니다 (확인). 전용 그룹을 만들면 잘됩니다. 그러나 로컬 Administrators 그룹의 구성원 만 연결할 수 있도록 구성하려고합니다. 나는 authorizedGroup을 "Administrators"또는 "BUILTIN \ Administrators"로 설정하려고 시도했지만 클라이언트를 실행하는 사용자가 Administrators 그룹의 구성원인데도 기본적으로 "액세스가 거부되었습니다"라는 클라이언트 쪽에서 예외가 발생합니다.

서버 구성 :

var clientProv = new BinaryClientFormatterSinkProvider(); 
var serverProv = new BinaryServerFormatterSinkProvider() { TypeFilterLevel = TypeFilterLevel.Full }; 
Hashtable channelProperties = new Hashtable(); 
channelProperties.Add("portName", "MyService"); 
channelProperties.Add("authorizedGroup", "Administrators"); 
channelProperties.Add("secure", "true"); 
channelProperties.Add("exclusiveAddressUse", false); 
channel = new IpcChannel(channelProperties, clientProv, serverProv); 
ChannelServices.RegisterChannel(channel, false); 
RemotingServices.Marshal(this, "MyService.rem"); 

클라이언트 구성 : 내가 무슨 일을 할 수

var clientProv = new BinaryClientFormatterSinkProvider(); 
var serverProv = new BinaryServerFormatterSinkProvider() { TypeFilterLevel = TypeFilterLevel.Full }; 
Hashtable channelProperties = new Hashtable(); 
channelProperties.Add("portName", "remotingClient_" + Guid.NewGuid().ToString("N")); 
channelProperties.Add("authorizedGroup", GetNameForSid(WellKnownSidType.LocalSystemSid)); 
channelProperties.Add("exclusiveAddressUse", false); 
channelProperties.Add("secure", "true"); 
channelProperties.Add("tokenImpersonationLevel", "identification"); 
channel = new IpcChannel(channelProperties, clientProv, serverProv); 
ChannelServices.RegisterChannel(channel, false); 

var uri = "ipc://" + "MyService/MyService.rem"; 
RemotingConfiguration.RegisterWellKnownClientType(new WellKnownClientTypeEntry(typeof(IMyService), uri)); 
remoteServer = (IMyService)Activator.GetObject(typeof(IMyService), uri); 

어떤 생각? 아니면 적어도 어떻게이 문제를 디버깅을 시작합니까.

+0

채널의 서버 및 클라이언트쪽에 대한 구성 코드를 게시 할 수 있습니까? LocalService가 아닌 LocalSystem으로 실행하고 있습니까? – csaam

+0

서비스가 로컬 시스템으로 실행 중입니다. 작업 mgr이이를 SYSTEM으로 표시합니다. –

답변

0

나는이 답변을 싫어한다는 것을 알고 있지만 그것은 나를 위해 일했다.

인터페이스 IMyService를 Ping이라는 단일 메서드로 만들었습니다. 그리고 나는 그것을 구현하고 난 당신이 원수의 호출에서 서비스로이 등록을 참조하십시오 이후의 생성자에 클라이언트 코드를 추가 :

public class MyService : MarshalByRefObject, IMyService 
{ 
    private IpcChannel channel; 
    public MyService() 
    { 
     var clientProv = new BinaryClientFormatterSinkProvider(); 
     var serverProv = new BinaryServerFormatterSinkProvider() { TypeFilterLevel = TypeFilterLevel.Full }; 
     Hashtable channelProperties = new Hashtable(); 
     channelProperties.Add("portName", "MyService"); 
     channelProperties.Add("authorizedGroup", "Administrators"); 
     channelProperties.Add("secure", "true"); 
     channelProperties.Add("exclusiveAddressUse", false); 
     channel = new IpcChannel(channelProperties, clientProv, serverProv); 
     ChannelServices.RegisterChannel(channel, false); 
     RemotingServices.Marshal(this, "MyService.rem"); 
    } 
    public string Ping(string value) 
    { 
     return value; 
    } 
} 

내가 NT 서비스 ONSTART 방법에 멤버 변수이면 MyService를 건설했다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var clientProv = new BinaryClientFormatterSinkProvider(); 
     var serverProv = new BinaryServerFormatterSinkProvider() { TypeFilterLevel = TypeFilterLevel.Full }; 
     Hashtable channelProperties = new Hashtable(); 
     channelProperties.Add("portName", "remotingClient_" + Guid.NewGuid().ToString("N")); 
     channelProperties.Add("authorizedGroup", GetNameForSid(WellKnownSidType.LocalSystemSid)); 
     channelProperties.Add("exclusiveAddressUse", false); 
     channelProperties.Add("secure", "true"); 
     channelProperties.Add("tokenImpersonationLevel", "identification"); 
     IpcChannel channel = new IpcChannel(channelProperties, clientProv, serverProv); 
     ChannelServices.RegisterChannel(channel, false); 

     var uri = "ipc://" + "MyService/MyService.rem"; 
     RemotingConfiguration.RegisterWellKnownClientType(new WellKnownClientTypeEntry(typeof(IMyService), uri)); 
     IMyService remoteServer = (IMyService)Activator.GetObject(typeof(IMyService), uri); 
     Console.WriteLine(remoteServer.Ping("Hello World")); 
    } 
    private static string GetNameForSid(WellKnownSidType wellKnownSidType) 
    { 
     SecurityIdentifier id = new SecurityIdentifier(wellKnownSidType, null); 
     return id.Translate(typeof(NTAccount)).Value; 

    } 
} 

핑 그냥 정말 에코 및 Console.WriteLine 출력에 "Hello World"입니다 :

는 LocalSystem으로 서비스를 설치하고 시작한 후 나는 클라이언트 코드를 실행.

사용자가 로컬 컴퓨터의 관리 그룹에 실제로 있지 않거나 MyService 자체가 수행 할 수있는 권한이없고 볼 수있는 부분이 서버 쪽 예외 일 수 있습니다 ? 예를 들어 LocalServer는 네트워크 리소스에 액세스 할 수 없습니다.

+0

"사용자가 실제로 로컬 컴퓨터의 관리자 그룹에 없습니다"- 확실히 (적어도 제어판 -> 관리 도구 -> 컴퓨터 관리 -> 로컬 사용자 및 그룹을 체크 할 때)입니다. 그러나 UAC가 여기에서 역할을하는 것 같습니다 : 레지스트리에서 EnableLUA를 0으로 설정하면 예상대로 작동합니다 (그러나 이는 분명히 해결책이 아닙니다). –