1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Пишу бесплатно скрипты

Тема в разделе "Поиск работы", создана пользователем Alekssss, 12.11.18.

  1. Alekssss

    Alekssss Активный участник

    535
    5
    Тренируюсь в написании скриптов на PowerShell. Готов бесплатно или почти бесплатно писать не очень навороченные скрипты под разные задачи.
     
    3aвулoн нравится это.
  2. gerodoth

    gerodoth Активный участник

    8.779
    312
    нужна идея
    есть много-много машин, на них крутятся постгрес, версии разные, местами 32-битные, местами 64.
    имя службы у них тоже отличается.
    нужно придумать как по действующей службе (может оказаться так что есть несколько служб, но запущена только одна) найти место расположения экзешника. чтобы потом обратиться к базе из скрипта.
     
  3. Alekssss

    Alekssss Активный участник

    535
    5
    Перечисление служб есть в реестре пути запуска и тип запуска там тоже есть. Можно помониторить процесс, зная какой именно и через него узнать кто и откуда запущен. Вопрос в другом если машин много и удаленных, какими средствами делать. Для WMI нужно одно , для Psexec другое. Обязательно нужны права локадминиа. Надеюсь под видой все крутится, с линукс совсем не знаком. Можно чуть более конкретное ТЗ?
     
    Последнее редактирование: 13.11.18
  4. gerodoth

    gerodoth Активный участник

    8.779
    312
    под виндой, будь она неладна..
    я настроен на psexec, часто им пользуюсь, хотя у нас и заббикс есть, но до него не пустят.
    права админа есть.
    службы называются примерно так: "pgsql-9.4.2-1.1C-x64"
    отличается номер версий, причем она будет в дальнейшем меняться, то есть поиск нужен по маске первых 5 символов
    в реестре смотреть службы в голову не приходило, штатно повершелл не обращается к службам, только к реестру?
     
  5. Alekssss

    Alekssss Активный участник

    535
    5
    не уверен что повершелл в данном случае лучивший выбор. На каждом компе разрешать выполнение не подписанных скриптов, подымать службу RM. В реестре есть ключи DisplayName и ImagePath в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet
    можно sc \\host query type= service в файл потом парсить, но здесь нет пути к исполняемому файлу, но есть параметр binPath. Что нужно узнать или отследить? Не заглядывал в повершелл слишком глубоко, но думаю он может многое.
     
    Последнее редактирование: 13.11.18
  6. gerodoth

    gerodoth Активный участник

    8.779
    312
    нужно получить путь к директории data, она лежит рядом с директорией bin, в которой находится экзешник службы
     
  7. Zahar661

    Zahar661 Активный участник

    1.418
    131
    ой, во время моего админства делали так, на всех машинах запускали батник, который раз в 5 минут проверял наличие нового скрипта в расширенной папке. и в этут папку складывали новые скрипты которые отрабатывали на всех машинах и что только не делали таким образом.

    PS: доступ к ГП нам москва не давала.
     
  8. Alekssss

    Alekssss Активный участник

    535
    5
    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, "\") разрежет путь до экзешника по "\" первый член массива "С:" последний сам экзешник
     
  9. gerodoth

    gerodoth Активный участник

    8.779
    312
    не, на вбс не надо, на вбс я бы мог, надо на повершелле, там для него потом с этой базой задачка будет та еще
     
  10. Alekssss

    Alekssss Активный участник

    535
    5
    vbs оболочка данные получаются по WMI который прикрутить к повершел можно, главное чтобы "количество вложений подкаталогов постоянное?", чтобы без доп.анализа
     
  11. gerodoth

    gerodoth Активный участник

    8.779
    312
    да, относительный путь всегда постоянный
     
  12. Lord Beaver

    Lord Beaver Активный участник

    1.720
    167
    Но зачем?!
    Есть командлет 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
     
    Последнее редактирование: 14.11.18
    gerodoth нравится это.
  13. gerodoth

    gerodoth Активный участник

    8.779
    312
    ¯\_(ツ)_/¯ политика компании
     
  14. Alekssss

    Alekssss Активный участник

    535
    5
    Сейчас сослан в Красноармейский р-н, до субботы подождет? За выводные постараюсь нарисовать.
     
  15. gerodoth

    gerodoth Активный участник

    8.779
    312
    да мне и этого хватит.
    экспериментировать в январе буду только, сейчас к новогодним продажам готовятся, кучу ресурсов на превентивные меры для оптимизации решили натратить.
     
  16. The Chief

    The Chief Активный участник

    7.829
    17
    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* (Касперский) со статусом (запущена или нет). Дальше сами допилите.
     
    Alekssss и gerodoth нравится это.
  17. Alekssss

    Alekssss Активный участник

    535
    5
    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"#Путь к текущей службе на текущем компьютере, можно писать в лог.
    }
     
    gerodoth нравится это.
  18. The Chief

    The Chief Активный участник

    7.829
    17
    Это шутка?

    Код:
    $bb = [system.String]::Join("\", $Pathname[0..PathName.Length-2])
    Вся фишка PowerShell в дичайшей компактности.
     
  19. reset

    reset Участник

    398
    1
    @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
        }