2014-02-14 5 views
1

Я создал службу Windows (сервер) и WPF (клиент), которая использует функции обратного вызова WCFs wsdualhttpbinding. Все, что находится между двумя частями программного обеспечения, работает правильно, но проблема, с которой я сталкиваюсь, заключается в том, что клиент должен работать с повышенными правами администратора для работы (что понятно, потому что оно должно открывать порты для связи с сервером)WCF wsdualhttpbinding клиент без повышения

Есть ли способ настроить клиента на работу без повышения? Или, возможно, создать одноразовое постоянное соединение, чтобы клиент не должен постоянно повышаться?

Я бегу из идей и терминов поиска Google ..

UPDATE

Я нашел решение. Пожалуйста, поправьте меня, если есть другая лучшая практика, которой я мог бы следовать!

Я добавил кнопки «Включить» и «Отключить» в клиентское приложение, которое запускает netsh, чтобы открыть (или закрыть) и зарезервировать порт.

Включить

Process process = new Process(); 
process.StartInfo = new ProcessStartInfo("netsh", @"http add urlacl url=http://+:" + PortNumber + @"/ user=DOMAIN\username"); 
process.StartInfo.Verb = "runas"; 
process.Start(); 
process.WaitForExit(); 

Отключить

Process process = new Process(); 
process.StartInfo = new ProcessStartInfo("netsh", "http delete urlacl url=http://+:" + PortNumber + "/"); 
process.StartInfo.Verb = "runas"; 
process.Start(); 
process.WaitForExit(); 

ответ

1

Я нашел решение. Пожалуйста, поправьте меня, если есть другая лучшая практика, которой я мог бы следовать!

Я добавил кнопки «Включить» и «Отключить» в клиентское приложение, которое запускает netsh, чтобы открыть (или закрыть) и зарезервировать порт.

Включить

Process process = new Process(); 
process.StartInfo = new ProcessStartInfo("netsh", @"http add urlacl url=http://+:" + PortNumber + @"/ user=DOMAIN\username"); 
process.StartInfo.Verb = "runas"; 
process.Start(); 
process.WaitForExit(); 

Отключить

Process process = new Process(); 
process.StartInfo = new ProcessStartInfo("netsh", "http delete urlacl url=http://+:" + PortNumber + "/"); 
process.StartInfo.Verb = "runas"; 
process.Start(); 
process.WaitForExit(); 
+0

У вас есть эта работа через Интернет, если так, я бы хотел переместить информацию о том, как заставить ее работать. Что нужно для настройки настроек веб-приложений и приложений и т. Д. ... –

0

К сожалению, можно только открыть порт на Windows, при запуске с правами администратора.

http://msdn.microsoft.com/en-us/library/ms740548%28v=VS.85%29.aspx

Чтобы использовать разъем типа SOCK_RAW требует административных привилегий. Пользователи, на которых запущены приложения Winsock, использующие сырые сокеты, должны быть членом группы администраторов на локальном компьютере, иначе вызовы raw сокета не с кодом ошибки WSAEACCES. В Windows Vista и более поздних версий доступ для сырых сокетов выполняется в сокет . В более ранних версиях Windows доступ для сырых сокетов - , применяемый во время других операций сокета.

Сырые сокеты предлагают возможность манипулировать базовым транспортным средством , поэтому их можно использовать для злонамеренных целей, которые создают угрозу безопасности . Поэтому только члены группы «Администраторы» могут создавать сокеты типа SOCK_RAW в Windows 2000 и более поздних версиях.

редактировать: Если у вас есть доступ к машине, как администратор, вы можете использовать Netsh http://technet.microsoft.com/en-us/library/cc725935(v=ws.10).aspx, чтобы разрешить пользователю определенное открытие порта.

Netsh HTTP добавить urlacl URL = http://+:80/Uri пользователь = DOMAIN \ User слушать = да

+0

Можно ли открыть порт (как повышенный пользователь) и подключиться к ней позже? По сути, мне просто нужен мой ServiceClient для подключения, но не обязательно каждый раз воссоздавать сокет. Неужели я на правильном пути? –

+0

Я не видел ваш обновленный вопрос. Вы должны добавить свое обновление в качестве ответа и, если не будет лучшего решения, придумайте его как решение. Возможно, также добавьте ссылку на документацию. – flayn