none
Повышенные привилегии PowerShell (UAC) RRS feed

  • Вопрос

  • Пытаюсь автоматизировать процесс подготовки образа установки Windows, в частности применение команд imagex.exe, pkgmgr.exe и т.д. из пакета Waik 1.1. Написал скрипт который запускает эти команды и при необходимости повышает права, кусок кода:

    [пример 1]

    $psi.FileName = $WAIK + "\imagex.exe"; 
    $psi.Arguments = "/mountrw "+$Sourcewim+" 1 $MpointPath";
    $psi.Verb = "runas";
    $psi.WindowStyle = "hidden"
    Write-Progress -Activity "Выполняется автономное обслуживание образа" -Status "Подключение образа" -SecondsRemaining -1
    $proc = [Diagnostics.Process]::Start($psi)
    $proc.WaitForExit()

    Все идёт отлично. Образ монтируется, файл ответов вносит изменения в оффлайн образ, образ сохраняется с изменениями. Остаётся пересоздать файл каталогов и создать ISO образ. ISO не проблема. Проблема с Component Platform Interface (CPI) из Waik SDK, чтобы создать каталог: 

    [пример 2]

    [System.Reflection.Assembly]::LoadFrom("c:\Program Files\Windows AIK\Tools\Image Manager\Microsoft.ComponentStudio.Common.dll")
    [System.Reflection.Assembly]::LoadFrom("C:\Program Files\Windows AIK\Tools\Image Manager\Microsoft.ComponentStudio.ComponentPlatformInterface.dll")
    $cpi = [Microsoft.ComponentStudio.ComponentPlatformInterface.Cpi]::get_Instance()
    [String]$Sourcewim = "D:\VistaWork\DVD\Windows Server 2008\sources\install.wim"
    $WimInfo = $Cpi.OpenWim($Sourcewim)
    foreach ($i in $WimInfo.Images) {
    Write-Host "Creating catalog for: " $i.ImageName
    $i.CreateCatalog()
    }

    нужны права администратора.

    И вот собственно вопросы. Как повысить привилегии в примере 2 или как проверить в теле скрипта запущен ли он (сам скрипт) с повышенными привилегиями?
    Делается всё в PowerShell 2.0

    28 декабря 2009 г. 11:58

Ответы

  • $IsElevated=$false
    foreach ($sid in [Security.Principal.WindowsIdentity]::GetCurrent().Groups) {
        if ($sid.Translate([Security.Principal.SecurityIdentifier]).IsWellKnown([Security.Principal.WellKnownSidType]::BuiltinAdministratorsSid)) {
            $IsElevated=$true
        }
    }
    if (-not $IsElevated)
    {
     Start-Process "$psHome\powershell.exe" -Verb Runas -ArgumentList ("-command cd $pwd; " + $MyInvocation.Line)
    }

    Помещаем в скрипт. Если он запущен не с административными привилегиями - запускает новую копию PowerShell с повышенными, и в качестве аргумента передает туда строку запуска самого себя.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    28 декабря 2009 г. 14:58
    Модератор

Все ответы

  • Проверяем наличие административных привилегий:
    $IsElevated=$false
    foreach ($sid in [Security.Principal.WindowsIdentity]::GetCurrent().Groups) {
        if ($sid.Translate([Security.Principal.SecurityIdentifier]).IsWellKnown([Security.Principal.WellKnownSidType]::BuiltinAdministratorsSid)) {
            $IsElevated=$true
        }
    }

    Запускаем с повышенными привилегиями:
    http://blogs.msdn.com/powershell/archive/2009/04/23/v2-quick-tip-starting-a-new-elevated-process-from-a-powershell-script.aspx


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    28 декабря 2009 г. 12:10
    Модератор
  • Спасибо. С первым ясно, а второй как я понял просто выполняет запуск одного процесса, файла из другого, но с повышением. А как его привязать к $cpi = [Microsoft.ComponentStudio.ComponentPlatformInterface.Cpi]::get_Instance()

    Или типа в начале скрипта делаю проверку:
    $IsElevated=$false
    foreach ($sid in [Security.Principal.WindowsIdentity]::GetCurrent().Groups) {
        if ($sid.Translate([Security.Principal.SecurityIdentifier]).IsWellKnown([Security.Principal.WellKnownSidType]::BuiltinAdministratorsSid)) {
            $IsElevated=$true
        }
    }
    и если получаю $false то запускаю повторно самого себя но уже как -Runas ?
    28 декабря 2009 г. 12:37
  • $IsElevated=$false
    foreach ($sid in [Security.Principal.WindowsIdentity]::GetCurrent().Groups) {
        if ($sid.Translate([Security.Principal.SecurityIdentifier]).IsWellKnown([Security.Principal.WellKnownSidType]::BuiltinAdministratorsSid)) {
            $IsElevated=$true
        }
    }
    if (-not $IsElevated)
    {
     Start-Process "$psHome\powershell.exe" -Verb Runas -ArgumentList ("-command cd $pwd; " + $MyInvocation.Line)
    }

    Помещаем в скрипт. Если он запущен не с административными привилегиями - запускает новую копию PowerShell с повышенными, и в качестве аргумента передает туда строку запуска самого себя.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    28 декабря 2009 г. 14:58
    Модератор
  • Помещаем в скрипт. Если он запущен не с административными привилегиями - запускает новую копию PowerShell с повышенными, и в качестве аргумента передает туда строку запуска самого себя.

    Ага, как быть с первым запуска скрипта? Он то все-равно продолжает выполняться, хотя по логике, если ему не хватает привилегий скрипт должен запустить копию себя, а самому "застрелиться". :-)

    29 декабря 2009 г. 8:57
  • exit?


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    29 декабря 2009 г. 9:49
    Модератор