Тренируюсь в написании скриптов на PowerShell. Готов бесплатно или почти бесплатно писать не очень навороченные скрипты под разные задачи.
нужна идея есть много-много машин, на них крутятся постгрес, версии разные, местами 32-битные, местами 64. имя службы у них тоже отличается. нужно придумать как по действующей службе (может оказаться так что есть несколько служб, но запущена только одна) найти место расположения экзешника. чтобы потом обратиться к базе из скрипта.
Перечисление служб есть в реестре пути запуска и тип запуска там тоже есть. Можно помониторить процесс, зная какой именно и через него узнать кто и откуда запущен. Вопрос в другом если машин много и удаленных, какими средствами делать. Для WMI нужно одно , для Psexec другое. Обязательно нужны права локадминиа. Надеюсь под видой все крутится, с линукс совсем не знаком. Можно чуть более конкретное ТЗ?
под виндой, будь она неладна.. я настроен на psexec, часто им пользуюсь, хотя у нас и заббикс есть, но до него не пустят. права админа есть. службы называются примерно так: "pgsql-9.4.2-1.1C-x64" отличается номер версий, причем она будет в дальнейшем меняться, то есть поиск нужен по маске первых 5 символов в реестре смотреть службы в голову не приходило, штатно повершелл не обращается к службам, только к реестру?
не уверен что повершелл в данном случае лучивший выбор. На каждом компе разрешать выполнение не подписанных скриптов, подымать службу RM. В реестре есть ключи DisplayName и ImagePath в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet можно sc \\host query type= service в файл потом парсить, но здесь нет пути к исполняемому файлу, но есть параметр binPath. Что нужно узнать или отследить? Не заглядывал в повершелл слишком глубоко, но думаю он может многое.
нужно получить путь к директории data, она лежит рядом с директорией bin, в которой находится экзешник службы
ой, во время моего админства делали так, на всех машинах запускали батник, который раз в 5 минут проверял наличие нового скрипта в расширенной папке. и в этут папку складывали новые скрипты которые отрабатывали на всех машинах и что только не делали таким образом. PS: доступ к ГП нам москва не давала.
On Error Resume Next Const wbemFlagReturnImmediately = &h10 Const wbemFlagForwardOnly = &h20 arrComputers = Array(".") For Each strComputer In arrComputers Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Service", "WQL",wbemFlagReturnImmediately + wbemFlagForwardOnly) For Each objItem In colItems If objItem.State = "Running" Then If InStr(1, objItem.PathName, "pgsql" ,1) <> 0 Then res=Split(objItem.PathName, "\", 1, 1) WScript.Echo "Caption: " & objItem.Caption WScript.Echo "Description: " & objItem.Description WScript.Echo "DisplayName: " & objItem.DisplayName WScript.Echo "Name: " & objItem.Name WScript.Echo "PathName: " & objItem.PathName WScript.Echo "ProcessId: " & objItem.ProcessId WScript.Echo "State: " & objItem.State End If End If Next Next Это VBS до делаю чуть позже количество вложений подкаталогов постоянное? res=Split(objItem.PathName, "\") разрежет путь до экзешника по "\" первый член массива "С:" последний сам экзешник
не, на вбс не надо, на вбс я бы мог, надо на повершелле, там для него потом с этой базой задачка будет та еще
vbs оболочка данные получаются по WMI который прикрутить к повершел можно, главное чтобы "количество вложений подкаталогов постоянное?", чтобы без доп.анализа
Но зачем?! Есть командлет Get-Service, но там нет нужной вам информации. Поэтому как-то так: Код: Get-CimInstance Win32_Service -Filter 'Name like "pgsql%" and State = "Running"' | ForEach-Object { $BinPath = Split-Path -Path $_.PathName.Replace('"','') -Parent $DataPath = Join-Path -Path (Split-Path -Path $BinPath -Parent) -ChildPath "data" Out-String -InputObject $BinPath,$DataPath } upd 11:10 — fix bug
да мне и этого хватит. экспериментировать в январе буду только, сейчас к новогодним продажам готовятся, кучу ресурсов на превентивные меры для оптимизации решили натратить.
Get-WmiObject Win32_Service | ? {$_.Name -like '*kl*'} | Select Name, DisplayName, State, @{Name="Path";Expression={$_.PathName.Split('"')[1]}}, @{Name="Version";Expression={((($_.PathName.Split('"')[1]) | Get-Item).VersionInfo.FileVersion)}} | Format-List Выводит все службы, где имя попадает под маску *kl* (Касперский) со статусом (запущена или нет). Дальше сами допилите.
cls #Список компов берется из этого файла c:\computers.txt для теста можно проверить на паре компов Get-Content c:\computers.txt | foreach { $PathName = Get-WmiObject Win32_Service -ComputerName $_ | ? {$_.Name -like '*pgsql*'} $PathName = $PathName.PathName.Split('\') $i = 0 $bb = "" do{ $b = $PathName[$i] $bb = $bb + $b + "\" $i++ } until( $i -eq $PathName.Split('\').Count-2) $Path = $bb + "data"#Путь к текущей службе на текущем компьютере, можно писать в лог. }
Это шутка? Код: $bb = [system.String]::Join("\", $Pathname[0..PathName.Length-2]) Вся фишка PowerShell в дичайшей компактности.
@Lord Beaver, +1 Я бы как-то так сделал (всякую правильную обвязку и проверку в расчет не берем - пример же) Код: $suffix="data" function get-service-exe($mask,$computer="localhost") { (Get-WmiObject -Query "select * from win32_service where name like '$mask' and state = 'Running'" -ComputerName $computer).pathname } foreach ($path in $(get-service-exe -mask pgsql%)) { $path=Split-Path $path if ($path) { $path=split-path $path } join-path $path $suffix }
Привет, подскажите, есть пример как на ps доставать данные из mssql, и сохранять в CSV/Xlsx? Так же интересует чтение из CSV и вставка в mssql построчно.
ооо, зачем так усложнять, CSV это текстовый файл, разделённый определенным делителем, чаще в европе и азии точка с запятой, в США просто запятая, и если текст содержит переносы или разделители в тексте то он заключается в кавычки, но можно всё заключать в кавычки. так что с выводом вообще нет проблем, со считыванием возможно. Вот с XL работать сложнее без библиотек.
мне хотелось бы в виде редактируемого кода, что бы не надо было компилить каждый раз (на делфях я тоже умею exe делать) я видел как с базами работают в bat файлах, подумал может родной для MS powershell умеет это лучше ну что, господа, примеры есть? или искать на других ресурсах?
@gerodoth, ага, делать обновляемые отчёты, можно напрямую к данным или к представлениям, Единственный минус доступ нужен пользователю ко всей базе на чтение и при шаловливых прямых ручках может узнать то что ему не положено. или нужна очень тонкая настройка представлений с авторстовом и ролями, я такие интересности видел в базе микросовфт дайнамикс. прикольно замучено там. сам пока не создавал.