Я надеюсь сделать это возможным для обычных пользователей, без прав администратора, чтобы они могли переключить локальную беспроводную карту в размещенную сеть (режим Windows softAP).
команда netsh здесь ясна
netsh wlan set hostednetwork mode=allow ssid=$WLANSSID key=$WLANKEY
поскольку я не хочу, чтобы пользователи могли устанавливать программное обеспечение, я не даю им прав локального администратора.
Я знаю, что есть несколько продуктов, которые шифруют пароли runas, но http://micksmix.wordpress.com/2013/03/20/capturing-credentials-from-encrypted-runas-software/ показывает, что интерфейс API Windows показывает пароли в открытом виде.
Я бы предпочел несколько идей :)
Похоже, это задание для диспетчера управления службами (SCM). SCM уже оборудован для безопасного хранения учетных данных и безопасного выполнения программ в контекстах, отличных от контекстов интерактивного пользователя. Пользователи, не являющиеся администраторами, не смогут получить доступ к учетным данным или напрямую взаимодействовать с контекстом безопасности, используемым для выполнения служб, но им будет разрешено запускать / останавливать службы, если у них есть разрешение.
Во-первых, важно знать, что вы жестяная банка запускать не обслуживающую программу как услугу. Будет сгенерировано сообщение об ошибке (и служба не покажет «Запущена»), но программа будет выполнена. В случае такой команды, как ваша netsh
, который выполняется и немедленно завершается, запуск его как «службы» будет работать нормально, чтобы выполнить то, что вам нужно. (Более длинные команды будут проблематичными, потому что SCM в конечном итоге завершит их, если они не ответят должным образом.)
Я не тестировал это с netsh
, но я использовал другую команду (net user bob /add
), чтобы «доказать», что Service Control Manager.
Создайте сервис, который выполняет вашу команду: sc create ServiceName binPath= "netsh wlan set hostednetwork mode=allow ssid=$WLANSSID key=$WLANKEY"
Измените дескриптор безопасности службы, чтобы разрешить «Пользователям» запускать / останавливать службу (бесстыдно взято из другой ответ на ошибку сервера): sc sdset ServiceName D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;RPWPDT;;;S-1-5-32-545)
Запустите службу как ограниченный пользователь. sc start SerivceName
Вы получите сообщение об ошибке 1053 «Служба не ответила на запрос запуска или управления своевременно». после в netsh
команда выполняется и завершается. В netsh
команда будет запущена в контексте безопасности СИСТЕМЫ.
Если вам нужно, чтобы пользователь мог взаимодействовать с командной строкой, это усложняется. Вероятно, вы могли бы написать какой-то сценарий в стиле барокко, чтобы пользователь мог указывать аргументы и, в свою очередь, считывать эти аргументы сценарием, который "служба" анализирует и передает в netsh
. Однако вы должны быть очень осторожны, чтобы случайно не позволить ограниченному пользователю произвольно выполнять код как СИСТЕМУ при его построении.