#windows #bat #powershell
Есть удаленный компьютер, под какой-то версией Windows (начиная с WinXP Home и заканчивая Win10). Компьютер не входит в домен, но на нем установлен RAdmin Server. Нужно определить версию и редакцию ОС. Т.к. компьютеров много (~300), то нужно что-то автоматизированное. Пробовал (Get-WmiObject Win32_OperatingSystem -computer "Имя компа").name но для недоменных компьютеров возвращает "Отказано в доступе (E_ACCESSDENIED)" Может можно как-то заскриптовать работу с RAdmin? Update Удалось автоматизировать вход на удаленную машину через Radmin Telnet. Теперь вопрос - как получить редакцию ОС? ver возвращает Microsoft Windows XP [Версия 5.1.2600] а нужно еще редакцию Home или Professional PowerShell на XP не установлен
Ответы
Ответ 1
wmic os get Caption,CSDVersion /value или (но у меня systeminfo думает ну очень долго) systeminfo | findstr /B /C:"OS Name" /C:"OS Version" Источник: https://www.windows-commandline.com/find-windows-os-version-from-command/Ответ 2
Полный ответ выглядит так (решение на JScript) Запускаем RadminViewer в режиме telnet var proc = WshShell.Exec('radmin.exe /connect:' + host + ' /telnet'); Ждем какое-то время и через SendKeys вбиваем логин и пароль соединения WScript.Sleep(1000); WshShell.AppActivate(proc.ProcessID); WshShell.SendKeys("user{TAB}"); WshShell.SendKeys("pass{ENTER}"); если в системе существует и третья и вторая версия Radmin (которая не требует имени пользователя), то можно использовать такой код WshShell.AppActivate(proc.ProcessID); // Три Shift+Tab WshShell.SendKeys("+{TAB}+{TAB}+{TAB}"); // Если у нас вторая версия, то мы стоим на поле для ввода пароля WshShell.SendKeys("pass"); // Переместились на предыдущий контрол WshShell.SendKeys("+{TAB}"); // для второй версии мы попали на кнопку "Отмена", для третьей на поле для ввода пароля WshShell.SendKeys("pass"); // Переместились на предыдущий контрол WshShell.SendKeys("+{TAB}"); // для второй версии мы попали на кнопку "OK", для третьей на поле для ввода логина WshShell.SendKeys("user"); WshShell.SendKeys("{ENTER}"); Делаем паузу на установку соединения и на удаленной машине формируем bat-файл WScript.Sleep(1000); WshShell.AppActivate(proc.ProcessID); // Получение информации и сохранение ее в info.data cmd('echo systeminfo ^> info.data >> info.bat'); // На WinXP Home нет файла systeminfo, поэтому если вызов завершился неудачно cmd('if errorlevel 1 ( >> ' + cmdFile); // скачиваем его с FTP сервера cmd('echo ftp -s:get.ftp -n ' + ftpServer + ' >> info.bat'); cmd('echo expand systeminfo.cab systeminfo.exe >> ' + cmdFile); cmd('echo systeminfo ^> ' + datFile + ' >> ' + cmdFile); cmd('del systeminfo.exe >> ' + cmdFile); cmd('del systeminfo.cab >> ' + cmdFile); cmd(')>> ' + cmdFile); // Сжимаем полученный файл cmd('echo makecab info.data info.data.cab >> info.bat'); // И отправляем его с удаленной машины по FTP cmd('echo ftp -s:info.ftp -n ' + ftpServer + ' >> info.bat'); Формируем набор команд для скачивания файла с FTP cmd('echo USER ftp_user ftp_pass >> get.ftp'); cmd('echo GET systeminfo.cab >> get.ftp'); cmd('echo QUIT >> get.ftp'); Формируем набор команд для закачивания файла на FTP cmd('echo USER ftp_user ftp_pass >> info.ftp'); cmd('echo PUT info.data.cab >> info.ftp'); cmd('echo QUIT >> info.ftp'); Запускаем полученный bat-файл cmd("info.bat"); И закрываем сессию cmd("exit"); Функция cmd() определена так function cmd(command) { WshShell.SendKeys(command.replace(/[\^%+~\(\)]/g, "{$&}") + "{ENTER}"); WScript.Sleep(100); } Единственный минус метода - невозможность получить статус соединения от radmin С учетом того обстоятельства, что команды systeminfo нет в редакциях WinXP Home и его приходится заливать вручную, целесообразнее написать свою утилиту, которая скачается с FTP сервера и выполнит все необходимые манипуляции
Комментариев нет:
Отправить комментарий