.NET, Сырые сокеты (raw sockets) и Windows 2008
Код:
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
[quote=System]
System.Net.Sockets.SocketException was unhandled by user code
Message="An attempt was made to access a socket in a way forbidden by its access permissions"
Source="System"
ErrorCode=10013
NativeErrorCode=10013
StackTrace:
// пропущен
InnerException:
[/quote]
На ручное требование всех доступов к сокетам:
Код:
new SocketPermission(PermissionState.Unrestricted).Demand();
UAC включен - понятно что дело в нем, так как "запуск от администратора" магическим образом избавляет от проблемы.
У кого-нить есть идеи, чего сделать с софтиной, чтобы UAC показывал окошко запроса разрешения у пользователя на повышение полномочий?
Код:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
</asmv1:assembly>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
</asmv1:assembly>
А вот меня до сих пор интересует, возможно ли в определенный момент выполнения программы вызвать сие окно?
Не слишком фанатичный поиск в интернетах также не выявил способов показать диалог UAC в определенный момент - только навесить на кнопку щит и ждать пока юзер на него нажмет, но у меня сэмпл не работал (щит появлялся, но нажатие на кнопку ни к чему не приводило).
Так что решение посредством манифеста мне видится наиболее корректным. Более того на основе изученной информации, полагаю, что повышение полномочий процесса (без потенциальных проблем) технически невозможно без его перезапуска - UAC умеет виртуализировать реестр к примеру ну и еще из-за пачки подобных тонкостей.
З.Ы. Оставляю возможность хака. ;)
Короче говоря, походу все диалоги системы с такими "щитовыми" кнопочками суть запускатели для программ имеющих манифесты повышенных привелегий...
Информация к размышлению:
По умолчанию сырые сокеты доступны только из-под учетной записи администратора, что не есть гуд, однако любые ограничения можно обойти и чтобы сырые сокеты заработали и на пользовательском уровне, достаточно открыть следующую ветвь системного реестра: HKLM\System\CurrentControlSet\Services\Afd\Parameters, найти там параметр DisableRawSecurity типа DWORD (если такого параметра нет - создать его), присвоить ему значение "1", после чего перезагрузиться и все! С этой минуты сырые сокеты доступны всем!
Цитата:
По умолчанию сырые сокеты доступны только из-под учетной записи администратора, что не есть гуд, однако любые ограничения можно обойти и чтобы сырые сокеты заработали и на пользовательском уровне, достаточно открыть следующую ветвь системного реестра: HKLM\System\CurrentControlSet\Services\Afd\Parameters, найти там параметр DisableRawSecurity типа DWORD (если такого параметра нет - создать его), присвоить ему значение "1", после чего перезагрузиться и все! С этой минуты сырые сокеты доступны всем!
Надобудет проверить на всевозможных ОС.
На ХР/2003 не сталкивался с такой фичей.
http://support.microsoft.com/kb/195445
Пишут что
Цитата:
In Windows 2000, there is no way to disable this security check. Access to Raw Sockets is granted on a per-transport basis. For the address family AF_INET, only administrators have the access necessary to create Raw Sockets.
хотя как-то туманно..
Вот глянь чего кстати нашлося
Цитата:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameters\DisableRawSecurity
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\AllowUserRawAccess
После установки требуется перезагрузка (по-новой инициализируются драйвера afd.sys и tcpip.sys).
На тестовой Windows XP SP3 (x86) также сработало.