Скрипт создания ярлыков удалённого управления

    Представьте, что у вас есть таблица с названиями и адресами устройств и сервисов и вы можете легко получить из неё множество ярлыков для запуска браузера, putty, удалённого рабочего стола или telnet для управления этими устройствами. На картинке ниже схематично это показано:

    Здесь красивая картинка про то, как сухие строчки электронной таблицы становятся чудодейственными ярлыками.
    Зачем это вообще нужно? Например к вам на эксплуатацию или обследование попала новая система или вам передали в пользование какую-нибудь тестовую среду. Чтобы не вбивать адреса или не копировать из файла каждый раз при подключении к хостам, можно однажды запустить скрипт и создать все ярлыки разом.

    Скрипт на powershell обрабатывает файл формата CSV, находит столбцы «имя», «адрес», «описание», «доступ», создаёт ярлыки. Команда для ярлыка формируется исходя из значения «доступ» (http, https, rdp, telnet), аргументы – из значения «адрес». Кстати, «адрес» может быть и не IP-адресом, а именем хоста, например. Поле «описание» попадает в комментарий ярлыка. В качестве названия полей также можно использовать shortname, address, method и desc. (Думаю, понятно, что есть что). Принимаются следующие параметры:
    • source <файл_источник> : путь к файлу CSV
    • folder <папка> : путь к папке, в которой нужно создавать ярлыки
    • noreplace : параметр нужно указать, если ярлыки были изменены вручную и хочется сохранить эти изменения при следующем запуске скрипта
    • namePolicy shortname | shortname_addr | addr_shortname | shortname_lastoct | shortname_last2octs : способ формирования имени ярлыка. Как видно, это один из вариантов: значение столбца «имя» из исходного файла, значение «имя» + «адрес», «адрес» + «имя» или же «имя» с добавлением одного или двух последних октетов «адрес».

    К примеру, вот так:
    PS C:\temp>.\create-shortcuts.ps1 -source MyNewFriends.csv -folder d:\job\new –noreplace –namePolicy shortname_addr

    По умолчанию, данные берутся из файла source.csv в текущем каталоге, ярлыки создаются тоже в текущем каталоге.
    Пути к программам putty и Internet Explorer задаются в начале скрипта. Разумеется, для всех способов соединения можно использовать любые другие программы. Главное учитывайте способ передачи параметра. Например, в mstsc имя хоста для соединения передаётся не просто через пробел, а как /v:<адрес>.
    Также, само собой, можете добавлять и другие способы соединения. Тут уже придётся править функцию createShct, раздел #Shortcut command.
    Да, если вы первый раз запускаете powershell-скрипт, не забудьте выполнить:
    PS C:\temp>set-executionpolicy -executionpolicy unrestricted -scope currentuser

    А вот и сам скрипт:
    ####################################################
    # Remote access shortcuts creation script
    # v0.9
    #
    # Defaults:
    #
    #    * Create shortcuts in current directory
    #    * Overwrite all shortcuts
    #    * Shortcut name is "shortname" column value
    #    * Shortcut comment is "desc" column value
    ####################################################
    # Создания ярлыков удалённого управления скрипт
    # версия 0.9
    #
    # По умолчанию:
    #
    #    * Ярлыки создаются в текущем каталоге
    #    * Все ярлыки перезаписываются
    #    * Имя ярлыка – столбец "имя"
    #    * Комментарий ярлыка - столбец "описание"
    ####################################################
    
    # Arguments
    
    param (
        [switch]$noreplace, # 'Do not overwrite shortcuts on creation' default is to overwrite
        $folder = '', # 'Target folder path' default is current dir
        $source = 'source.csv', # 'Source data file path' default
        $namePolicy = 'shortname' # 'Shortcut naming policy' default
    )
    
    $csvPath = $source # Source data file path
    $shPath = $folder # Target folder path
    $shNoReplace = $noreplace # Do not overwrite shortcuts on creation
    $shHTTPcmd = '"C:\Program Files\Internet Explorer\iexplore.exe"'
    $shRDPcmd = 'mstsc.exe'
    $shSSHcmd = '"C:\Program Files\PuTTY\putty.exe"'
    $shTELNETcmd = 'telnet.exe'
    $shNamePolicy = $namepolicy # Shortcut naming policy
    
    function createShctFile($shText,$shCmd,$shArgs, $desc = '')
    { # creating shortcut file
        $shPathSh = "$shPath\$shText.lnk"
        if ( (test-path -path $shPathSh) -and $shNoReplace ) {return}
        $shct = $oshell.CreateShortcut($shPathSh)
        $shct.TargetPath = $shCmd
        $shct.Arguments = $shArgs
        $shct.Description = $desc
        $shct.Save()
    }
    
    function createShct($shortname,$desc='',$addr,$method)
    { # preparing shortcurt parameters
        # Shortcut name
        $shText = $shortname
        if (!$shortname)
        {
            write-host '(i) No shortcut name defined'
            return
        }
        switch ($shNamePolicy) {
            'shortname' {
                $shText = $shortname
            }
            'shortname_addr' {
                $shText = "$shortname $addr"
            }
            'addr_shortname' {
                $shText = "$addr $shortname"
            }
            'shortname_lastoct' {
                $octs = ($addr -split '\.')
                if ($octs[3]) {$shText += ' ' + $octs[3]}
            }
            'shortname_last2octs' {
                $octs = ($addr -split '\.')
                if ($octs[3]) {$shText += ' ' + $octs[2]+ '.' + $octs[3]}
            }
        }
        
        #Shortcut command
        $shArgs = ''
        switch ($method) {
            'http' {
                $shCmd = $shHTTPCmd
                $shArgs = "http://$addr"            
            }
            'https' {
                $shCmd = $shHTTPCmd
                $shArgs = "https://$addr"            
            }
            'rdp' {
                $shCmd = $shRDPCmd
                $shArgs = "/v:$addr"
            }
            'ssh' {
                $shCmd = $shSSHcmd
                $shArgs = $addr
            }
            'telnet' {
                $shCmd = $shTELNETcmd
                $shArgs = $addr
            }        
        }
        createShctFile -shText $shText  -shCmd $shCmd -shArgs $shArgs -desc $desc
    }
    
    ##### Main
    
    # Init
    
    $oshell = New-Object -comObject WScript.Shell
    $basePath = (get-location).path # Working dir
    [System.IO.Directory]::SetCurrentDirectory($basePath) # Set working dir to script working dir
    
    # Env check
    
    if (!(test-path -pathtype leaf -path $csvPath))
    { # Cheking for source CSV path
        write-host "(!) Path to source CSV not found: $csvPath"
        exit
    }
    if (!($shPath)) {$shPath = $basePath }
    if (!(test-path -pathtype container -path $shPath))
    { # Cheking for target folder path
        write-host "(!) Path for shortcuts not found: $shPath"
        exit
    }
    
    # Run
    
    $csv = get-content $csvPath | Convertfrom-CSV -UseCulture
    foreach ($str in $csv)
    {
        $shrt = $str.shortname
        if ($str.имя) {$shrt = $str.имя}
        $addr = $str.addr
        if ($str.адрес) {$addr = $str.адрес}
        $accs = $str.method
        if ($str.доступ) {$accs = $str.доступ}
        $desc = $str.desc
        if ($str.описание) {$desc = $str.описание}
        createShct -shortname $shrt -desc $desc -addr $addr -method $accs
    }
    
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 27

      –18
      Такая полезная информация. Я думаю, миллионы людей будут рады возможности создавать ярлыки из таблицы…
      Ирония, конечно-же...
        +1
        Вы не поверите, в крупных компаниях это очень полезно. Да и в мелких тоже. Про ДЦ я молчу.
        Особенно если админов много, можно добавлять информацию, потом кормить скрипт и будет счастье.

        Для себя я вижу данный скрипт очень полезным.
        Спасибо большое за старания.
      0
      Отличный вариант. Сам когда то пользовался различными организаторами удаленных подключений (типа mRemote). А тут дешево и сердито, никакого лишнего ПО ставить не нужно.
        0
        Не, без mRemote сложно. Тут ведь будет запускаться обычный mstsc, а когда их штук 10 и надо часто прыгать с одного на другой — становится очень сложно.
          0
          RDCman — для рдп подключений использую (он нативнее и удобнее)
          а для ssh — winscp + putty.
          У mRemote было несколько неприятных багов (к примеру: в случае некорректного его закрытия можно легко потерять весь список хост ).
            0
            тоже отказался от mremote:
            1. .NET — поделие (вылеты (exceptions) в произвольных местах
            2. Настройки putty — не дает редактировать большинство
            3. Хранит все пароли в ini — без мастер пароля
              0
              Ребята, я наверное один такой везучий :) Вот серьезно, у меня не падает и не теряет ничего (если не забывать сэйв после добавления нового сервера). Но в любом соучае спасибо за альтернативы, попробую, вдруг удобнее.
              0
              Не знаю, насколько уместно, но вместо WinSCP рекомендую попробовать ExpanDrive.
              0
              mRemote очень глючный. Падает постоянно, фаворитесы потерял. Рекомендую RD Tabs — оочень удобная вещь.
            +8
            Меня лично не интересует данный скрипт, но мне понравилось оформление кода.
            Чисто субъективно, конечно. Но кажется вы старались, когда его писали. Это такая редкость нынче. +1
              +6
              Я в прошлом программист. Может быть поэтому мне приятно видеть оформленный код.
              0
              Обязательно на заметку.
                0
                А сделать тоже самое но с кнопочкой админить прям в экселевском файле не? Встаем на айпишник жмем кнопку, запускается нужная оснастка?
                +1
                Если эта таблица в виде web-страницы, то можно настроить запуск прям с неё, запускать putty и прочее указав нужный протокол:
                rdp:dc1.dom.local
                ssh:ru-msk-va0
                Настройка: www.py-my.ru/post/4c60bd8b1d41c87cc7000000 и msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx
                  0
                  В принципе, гиперссылки можно и прямо в excel-файл вставить. Товарищ выше что-то подобное предложил. Другое дело, если этими ярлыками не я один пользуюсь, это каждый должен у себя реестр изменять. Наверное, лучше вставить просто кнопку непосредственно в excel-файл. Может и займусь, если время будет. Или кто-нибудь здесь вдхоновится и сделает.
                  0
                  [System.IO.Directory]::SetCurrentDirectory($basePath)

                  наверное лучше

                    0
                    Set-Location $basePath

                    Хотя я вообще не понял что делает код:

                    $basePath = (get-location).path # Working dir
                    [System.IO.Directory]::SetCurrentDirectory($basePath) # Set working dir to script working dir
                      0
                      [System.IO.Directory]::SetCurrentDirectory($basePath) устанавливает рабочий каталог для программ, которые будут запущены из скрипта. В данном скрипте он должен совпадать с рабочим каталогом самого скрипта. Set-location же устанавливает рабочий каталог для самого скрипта.
                        0
                        это для WScript.Shell? Я это обошел абсолютными путями. Просто если уж менять текущую дериткорию, наверное стоит ее обратно вернуть.
                          0
                          Да, для него. Специально хотел избежать обязательного использования абсолютных путей. Согласитесь, большинство утилит и скриптов могут воспринимать относительные пути.
                          Насчёт вернуть, в принципе верно. Но не думаю, что кто-то будет пользоваться той сессией командной строки, в которой он запустил этот скрипт а потом вышел из powershell.
                            +1
                            Абсолютные пути я вычислял, join-path get-location «relateive path).
                              0
                              Дело. Наверное, я поленился.
                                +1
                                Resolve-Path еще лучше (можно вайлдкарды экспандить в качестве бонуса).
                      0
                      Я, для этих целей, использую MRemote, хоть и старенький(новый уже не опенсорс и щза него денег хотят) — но до сих пор полностью устраивает. Умеет: RDP, VNC, ICA, SSH, Telnet, HTTP/S, Rlogin, RAW — и все это в одной программе, нет необходимости держать кучу ярлыков. есть и портейбл-версия

                      Only users with full accounts can post comments. Log in, please.