Недавно мне понадобилось создать через Deployment Workbench в Task Sequense ярлыки на рабочем столе пользователей при установке Windows 10. Казалось что может быть проще? На самом деле пришлось повозиться.
Я всегда думал, что символическая ссылка и обыкновенный ярлык в проводнике Windows — это одно и тоже. Чем же отличаются ярлык и символическая ссылка?
- для создания символической ссылки требуются права администратора
- если скопировать символическую ссылку в другую директорию, то вместо символической ссылки окажется файл, на который ссылается ссылка, но без расширения. Например сделаем так:
cp "Internet Explorer" .\test2\
и вот что можно увидеть в папке test2
- В проводнике Windows отображает эти ресурсы по-разному:
Поэтому для сценариев развертывания Windows лучше всего подойдет возможность создания ярлыков: их можно и скопировать и прав администратора они не будут запрашивать. Создавать только их сложнее: необходимо вписать следующие строчки в ваш скрипт:
$Install_Path = "C:\Users\AVIvanov\Desktop\test"
Так мы создадим ярлык на Internet Explorer в папке «test» на моем рабочем столе.
$WSShell = New-Object -com WScript.Shell
$ShortcutPath = Join-Path -Path $Install_Path -ChildPath "Internet Explorer.lnk"
$NewShortcut = $WSShell.CreateShortcut($ShortcutPath)
$NewShortcut.TargetPath = "C:\Program Files\Internet Explorer\iexplore.exe"
$NewShortcut.Save()Если нужно создать ярлык на URL-адрес, то это будет выглядеть немного по другому:
$Install_Path = "C:\Users\AVIvanov\Desktop\test"
$WSShell = New-Object -com WScript.Shell
$ShortcutPath = Join-Path -Path $Install_Path -ChildPath "Яндекс.url"
$NewShortcut = $WSShell.CreateShortcut($ShortcutPath)
$NewShortcut.TargetPath = "https://yandex.ru"
$NewShortcut.Save()
Ещё пример: скрипт, который будет открывать в Google Chrome сайт mail.ru:
$Install_Path = "C:\Users\onix\Desktop"
$WSShell = New-Object -com WScript.Shell
$ShortcutPath = Join-Path -Path $Install_Path -ChildPath "MAILRU.lnk"
$NewShortcut = $WSShell.CreateShortcut($ShortcutPath)
$NewShortcut.TargetPath = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
$NewShortcut.Arguments = "https://mail.ru"
$NewShortcut.Save()Если кому-то все же понадобится создать именно символическую ссылку через powershell, то такая возможность появилась совсем недавно в Windows 10 1703:
New-Item -Path "C:\Users\AVIvanov\Desktop\test\Internet Explorer" -value "C:\Program Files\Internet Explorer\iexplore.exe" -ItemType symboliclink
-в той же папка «test» на рабочем столе
То есть либо мы указываем путь к локальному файлу, либо адрес в сети ($NewShortcut.TargetPath = «…»). А как вписать и то, и это?
В свойствах ярлыка любого браузера можно в поле «Объект» через пробел от указанного в кавычках пути к файлу запуска браузера дописать адрес интернет-ресурса. Тогда будет сразу открываться заданная ссылка.
Добавил новый пример в статью. Можно сделать так, как вам нужно
Доброго, есть такая хитрая ссылка на сетевое подключение, которая располагается по пути
UserProfile%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\
Если добавить соединение с помощью мастера добавления сетевого расположения, в этой папке создается ссылка на него (соединение), причем это ссылка на папку (хотя если посмотреть ее свойства то она отличается от обычной ссылки на папку) а в папке находится файл target.lnk. Вопрос можно создать такую ссылку с помощью PowerShell Ссылку target.lnk в обычную созданную мной папку в UserProfile%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\ создавал по вашей инструкции, работает но не совсем корректно, т.к. это все же обычная папка, а что это за ссылка на сетевую папку (соединение) найти не могу…
У меня на Windows 10 при создании VPN-подключения не создался там никакой ярлык. Вы на Windows 7 возможно это делаете?
Это и в Windows 7 и 8.1 и 10 (сейчас проверил) в проводнике выделяем [Этот компьютер] правой кнопкой вызывается контекстное меню, там пункт [Добавить новый элемент в сетевое окружение] — Запускается мастер добавления сетевого расположения надо, (это только Win10, закрыть окно предлагающее подключение к Интернету) Выбрать другое сетевое расположение, там можно указать подключение либо к сетевой шаре (\\Server\share) либо FTP, после отработки которого и создается данный ярлык в указанной выше папке….
%UserProfile%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\ а так же в списке с лева в проводнике под [Этот компьютер] появляется папка с Введенным нами названием а значок папки либо папка с сетевым входом если локальное соединение, либо еще значок добавляется глобусом, если FTP.
Идея в том что мне нужно групповыми политиками раскидать по рабочим станциям определенные шары в том числе FTP, пробовал создавать на одном компьютере и скопировать на другой через скрипт, но команды copy или xcopy не подходят т.к. они при выполнении превращают соединение в реальную папку а это по ходу какая то хитрая папка если посмотрите ее свойства увидите и поведение ее будет не таким….
Оказывается все просто. Этот тот же самый обычный ярлык, только имеющий атрибут на файле «ReadOnly». Если его заменить на «Normal», то он превращается в папку, внутри которой находится обычный ярлык с указанием пути. Чтобы понять о чем я написал, выполни команду Set-ItemProperty -Path «$env:APPDATA\Microsoft\Windows\Network Shortcuts\Test» -Name Attributes -Value Normal , где Test — название ярлыка и ты увидишь что он распался на обычную папку с ярлыком внутри. чтобы все вернуть назад выполняем Set-ItemProperty -Path «$env:APPDATA\Microsoft\Windows\Network Shortcuts\Test» -Name Attributes -Value Readonly. Таким образом тебе перед копированием в скрипте нужно менять атрибут файла на «Normal» и скопировать папку и ярлык внутри него и после копирования вернуть его на «ReadOnly».
А если не хочется с этим возиться, то воспользуйся robocopy c ключом /COPYALL, он копирует как надо, главное когда указываешь директорию назначения нужно указывать папку, например так: robocopy «C:\Users\onix\AppData\Roaming\Microsoft\Windows\Network Shortcuts\Test» C:\Test /COPYALL
К стати добавлю, если эту папку, соединение копировать самим проводником или Total Commander ом то папка копируется без изменения ее свойств….
Кажется нашел способ, использовать буфер обмена, попробовал скопировать сию ссылку в буфер обмена и вставить в нужную мне папку %UserProfile%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\ все получилось
————————
PowerShell
Добраться до буфера обмена можно с помощью .Net класса Clipboard. Для того, чтобы этот класс стал доступен, сначала загрузим сборку: Add-Type -AssemblyName PresentationCore
После чего выведем статические методы класса командой:
[Windows.Clipboard] | Get-Member -Static
Но пока не могу разобраться ни как загрузить сию ссылку из указанного места, скорее всего это
SetDataObject, ни как выгрузить в нужное мне место GetDataObject
не могу найти информации, вот только пока что нашел
https://windowsnotes.ru/powershell-2/rabotaem-s-buferom-obmena-iz-komandnoj-stroki/