Pull to refresh

Вариант управления компьютером на Windows из-под консоли Linux

Reading time 2 min
Views 32K
Бывают попадаются задачи, когда надо что-то сделать из-под Linux-а на машине, на которой установлен Windows, но не через RDP или VNC. Или например, как в моём случае, основная машина на Linux и необходимо управлять группой серверов. И для простых задач, например простого запроса типа dsquery group -name "Группа" | dsget group -members | dsget user, который выдаст полный список членов группы в Active Directory со всеми полями — не запускать же ради такого сеанс RDP.
Простого и удобного инструментария я, если честно, не нашёл. За исключением двух утилит: wmic и winexe, которые входят в комплекты Zenoss и OpenVAS. Вернее входили в Zenoss. Не суть, отдельно их я не нашёл, поэтому далее предлагаю свой вариант, большей частью для конкретного дистрибутива (Xubuntu 13.04), но при должной сноровке — всё можно сделать и в любом другом.
Итак, начнём:
wget http://www.openvas.org/download/wmi/wmi-1.3.14.tar.bz2
tar -xvf wmi-1.3.14.tar.bz2
cd wmi-1.3.14\Samba\source\wineexe\
Далее либо вручную либо с помощью patch -p0 -i patchfile применяем изменения из https://gist.github.com/raw/843062/5bb87c4fa13688f65ca8b1e54fc42676aee42e5a/fix_winexe_service.diff.
Потом:
sudo make
После чего можно уже делать:
winexe -U domain/user%password //server 'dsquery group -name "Группа"| dsget group -members | dsget user'
или
wmic -U domain/user%password //server 'select * from Win32_ComputerSystem'
Первая команда winexe позволяет запускать любые консольные команды через RPC на Windows-машине, вторая позволяет делать WMI-запросы, что вообщем-то даёт ещё больше возможностей (вот справочник по WQL, это вариант SQL for WMI — http://msdn.microsoft.com/en-us/library/windows/desktop/aa394606%28v=vs.85%29.aspx).
Однако есть проблема с выводом консоли winexe от удалённой машины, поскольку Microsoft любит и UTF-16, и CP1251, и CP866 разом. А местами и вовсе UCS-2. Точнее, в моём случае, вывод был в старой доброй CP866. Проблема решается очень просто:
luit -encoding cp866 winexe -U domain/user%password //server 'cmd'
И на выводе затем мы имеем:
Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corporation), 2009. Все права защищены.

C:\Windows\system32>
Однако, опять таки в моём случае, luit 1.1 категорически не хотел видеть charmaps для cp866 и выдавал Warning: couldn't find charset data for locale XXXX; using ISO 8859-1 (похоже на https://bugs.launchpad.net/ubuntu/+source/x11-utils/+bug/280449, фикс есть, пакета нет). Я решил для себя, что проще скачать исходники сильно свежего luit-а — http://invisible-island.net/luit. Увидеть его в составе x11-utils, где обычно он и бывает, вряд ли будет возможно. Далее:
./configure 
Возможно не будет каких-то зависимостей, всё решаемо. У меня всё пролетело быстро.
sudo make 

Свежескомпилированный luit 2.0 прекрасно переконвертирует на лету из 866 в UTF-8, т.е. в целом моя задача выполнена.
В целом руководствовался тем, что конкретная рабочая машина, настроенная один раз будет управлять любой дефолтной Windows-машиной, на которой запущен RPC и есть права.
Надеюсь на критику, комментарии и предложения.

upd: Спасибо Slipeer за ссылку на заметно более свежий winexe — http://sourceforge.net/projects/winexe/!
upd2: Важный момент, на который стоит обратить, — при запуске cmd посредством winexe внутри не работают клавиши курсора и backspace. В написании скриптов на типовые операции мне это совсем не мешает :)
Tags:
Hubs:
+15
Comments 33
Comments Comments 33

Articles