Здравствуйте, octo47, Вы писали:
KV>>Я правильно понимаю, что если выразить задачу более абстрактно, то нужно с эталонной машины слить некие настройки из профиля эталонного пользователя и перенести их на удаленную машину?
O>Не совсем. В общем случае настройки моей рабочей станции имеют мало общего с серверными настройками.
Тогда зачем? Я просто не совсем себе представляю способ применения этого на винде

Юникс-вэем попахивает
O>>>Просто интересно как это будет выглядить без winrar.exe
KV>>А зачем тут именно winrar? В винде есть вполне стандартный makecab.exe, а в .NET (которая является неотъемлемой частью PS) — System.IO.Packaging в целом, и ZipPackage в частности
O>Я про самораспаковывающийся шелл-скрипт (на PS).
Времени нет, но вот proof-of-concept (ps-скрипт, содержащий в себе зазипованный notepad.exe, который его из себя извлекает, распаковывает и запускает. используются только стандартные средства XP и .NET 2.0 и выше):
$scriptFullName = $MyInvocation.MyCommand.Path
$temporaryPath = $env:temp + '\' + $MyInvocation.MyCommand.Name
new-item -path $temporaryPath -type directory
$attachmentFullName = $temporaryPath + '\' + $MyInvocation.MyCommand.Name.Replace('.ps1', '.zip')
[Byte[]]$scriptContent = [System.IO.File]::ReadAllBytes($scriptFullName)
$attachmentPosition = 0
while ($scriptContent[$attachmentPosition] -ne 64 -or
$scriptContent[$attachmentPosition + 1] -ne 39)
{
$attachmentPosition++
}
$attachmentPosition += 3
$attachmentSize = $scriptContent.Length - $attachmentPosition - 14
[Byte[]]$attachmentContent = New-Object Byte[] $attachmentSize
[Array]::Copy($scriptContent, $attachmentPosition, $attachmentContent, 0, $attachmentSize)
[System.IO.File]::WriteAllBytes($attachmentFullName, $attachmentContent)
$shellApplication = new-object -com Shell.Application
$zipFolder = $shellApplication.NameSpace($attachmentFullName)
$destinationFolder = $shellApplication.NameSpace($temporaryPath)
$folderItems = $zipFolder.Items()
$destinationFolder.CopyHere($folderItems);
invoke-item $temporaryPath\*.exe | Out-Null
@'
<здесь был бинарник внедренного zip-файла>
'@ | Out-Null
Работающий прототип можно взять
тут. Распаковать и запустить файл в консоли ps. Запустится внедренный блокнот.