Pull to refresh

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

Reading time 4 min
Views 19K
Представьте, что у вас есть таблица с названиями и адресами устройств и сервисов и вы можете легко получить из неё множество ярлыков для запуска браузера, 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
}
Tags:
Hubs:
+41
Comments 27
Comments Comments 27

Articles