Powershell 2.0 sudo ограничения - PullRequest
       13

Powershell 2.0 sudo ограничения

1 голос
/ 02 января 2012

Долгое время читатель, но новый плакат.Я боролся с этой проблемой целый день, и это сводит меня с ума.Обыскивая этот сайт и Google, я все еще застрял.По сути, я не могу понять, как реализовать «sudo» в Powershell, который работает с CmdLet Copy-Item.Вот мой код:

PROFILE.PS1:

# Trigger UAC to elevate the supplied command
function Elevate-Process() {
    if($args.Length -eq 0) {
        error ('USAGE: ' + $MyInvocation.InvocationName + ' <executable> [arg1 arg2 arg3 ...]');
    } else {
        try {
            if($args.Length -eq 1) {
                Start-Process $args[0] -Verb RunAs;
            } else {
               Start-Process $args[0] -ArgumentList $args[1..$args.Length] -Verb RunAs;
            }
        } catch {
            error $_.Exception.Message;
        }
    }
}

# Display pretty-formatted error messages
function error() {
    # Validate function parameters
    Param(
        [Parameter(Mandatory=$true)]
        [ValidateScript({$_.GetType().Name -eq 'String'})]
        $sMessage
    );

    Write-Host $sMessage -BackgroundColor Yellow -ForegroundColor Red;
}

# Set aliases
set-alias sudo Elevate-Process;

APPLY-INI.PS1:

sudo Copy-Item '.\standard_menu.ini' 'C:\Program Files (x86)\Opera\ui\';
#sudo [System.IO.File]::Copy '.\webmailproviders.ini' 'C:\Program Files (x86)\Opera\defaults\webmailproviders.ini' $true;

Write-Host 'Press any key to exit...';
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null;

Когда я выполняю powershell.exe. \ Apply-ini.ps1 , я получаю следующую ошибку:

Эта команда не может быть выполнена из-за ошибки: система не может найти указанный файл.

Я пробовал ВСЕ, что мог найти без удачи.Надеюсь, кто-то может указать мне правильное направление.

Ответы [ 2 ]

2 голосов
/ 02 января 2012

Есть несколько тонкостей для реализации хорошей команды с повышенными вызовами.Это текущая реализация Invoke-Elevated, которую мы используем в Расширения сообщества PowerShell (2.1 Beta).Вы можете найти это полезным для того, чтобы заставить себя работать, или просто взять PSCX 2.1 Beta.: -)

 Invoke-Elevated
    Opens a new PowerShell instance as admin.
.EXAMPLE
    C:\PS> Invoke-Elevated Notepad C:\windows\system32\drivers\etc\hosts
    Opens notepad elevated with the hosts file so that you can save changes to the file.
.EXAMPLE
    C:\PS> Invoke-Elevated {gci c:\windows\temp | export-clixml tempdir.xml; exit}
    Executes the scriptblock in an elevated PowerShell instance.
.EXAMPLE
    C:\PS> Invoke-Elevated {gci c:\windows\temp | export-clixml tempdir.xml; exit} | %{$_.WaitForExit(5000)} | %{Import-Clixml tempdir.xml}
    Executes the scriptblock in an elevated PowerShell instance, waits for that elevated process to execute, then
    retrieves the results.
.NOTES
    Aliases:  su
    Author:   Keith Hill
#>
function Invoke-Elevated 
{
    Write-Debug "`$MyInvocation:`n$($MyInvocation | Out-String)"

    $startProcessArgs = @{
        FilePath     = "PowerShell.exe"
        ArgumentList = "-NoExit", "-Command", "& {Set-Location $pwd}"
        Verb         = "runas"
        PassThru     = $true
        WorkingDir   = $pwd
    }

    $OFS = " "
    if ($args.Count -eq 0)      
    {
        Write-Debug "  Starting Powershell without no supplied args"
    }
    elseif ($args[0] -is [Scriptblock]) 
    {
        $script  = $args[0]
        $cmdArgs = $args[1..$($args.Length)]
        $startProcessArgs['ArgumentList'] = "-NoExit", "-Command", "& {Set-Location $pwd; $script}"
        if ($cmdArgs.Count -gt 0)
        {
            $startProcessArgs['ArgumentList'] += $cmdArgs
        }
        Write-Debug "  Starting PowerShell with scriptblock: {$script} and args: $cmdArgs"
    }
    else
    {
        $app     = Get-Command $args[0] | Select -First 1 | ? {$_.CommandType -eq 'Application'}
        $cmdArgs = $args[1..$($args.Length)]
        if ($app) {
            $startProcessArgs['FilePath'] = $app.Path
            if ($cmdArgs.Count -eq 0)
            {
                $startProcessArgs.Remove('ArgumentList')
            }
            else
            {
                $startProcessArgs['ArgumentList'] = $cmdArgs
            }
            Write-Debug "  Starting app $app with args: $cmdArgs"
        }
        else {
            $poshCmd = $args[0]
            $startProcessArgs['ArgumentList'] = "-NoExit", "-Command", "& {Set-Location $pwd; $poshCmd $cmdArgs}"
            Write-Debug "  Starting PowerShell command $poshCmd with args: $cmdArgs"
        }
    }

    Write-Debug "  Invoking Start-Process with args: $($startProcessArgs | Format-List | Out-String)" 
    Microsoft.PowerShell.Management\Start-Process @startProcessArgs
}
0 голосов
/ 02 января 2012

Вы вызываете Start-Process с командлетом (copy-item) в качестве аргумента filepath вместо filepath исполняемого файла.

sudo xcopy '.\standard_menu.ini' 'C:\Program Files (x86)\Opera\ui\';

сделает свое дело.

...