Скрипт, блокирующий отличный сценарий Powershell в xp_CMDShell

#sql #powershell #xp-cmdshell #scriptblock

#sql #powershell #xp-cmdshell #scriptblock

Вопрос:

У меня есть скрипт, который отлично работает в powershell. Вы предоставляете ему видеофайл, и он сообщает вам все расширенные атрибуты.

Я пытаюсь выполнить это из XPCmdShell SQL, окружив его блоком сценария типа «amp;{мой код идет сюда}», но это не работает. Это говорит мне, что мне не хватает фигурных скобок, но я их хорошо завернул, так как я добавил одну пару для блокировки скрипта.

Может ли кто-нибудь с опытными глазами сказать мне, чего мне не хватает?

 declare @cmd varchar(8000)
set @cmd = 'powershell -Command "amp;{
    $InputObject = ''C:DownloadsPowershellScriptsTeststestvideo.mp4'';
    $shell = New-Object -ComObject Shell.Application;
        foreach($object in $InputObject)
        {
            if($object -is [string])
            {
                try
                {
                    $object = Get-Item $object -ErrorAction Stop
                }
                catch
                {
                    Write-Warning "Error while processing $object : $($_.exception.message)"
                    break
                }
            }
            try
            {
                Test-Path $object -ErrorAction Stop
            }
            catch
            {
                Write-Warning "Error while processing $($object.fullname) : $($_.exception.message)"
                break
            }
            switch ($object)
            {
                {$_ -is [System.IO.DirectoryInfo]}{
                    write-host Processing folder $object.FullName -ForegroundColor Cyan
                    $currentfolder = $shell.namespace($object.FullName)
                    $items = $currentfolder.items()
                }
                {$_ -is [System.IO.FileInfo]}{
                    write-host Processing file $object.FullName -ForegroundColor Cyan
                    $parent = Split-Path $object
                    $currentfolder = $shell.namespace($parent)
                    $items = $currentfolder.ParseName((Split-Path $object -Leaf))
                }
            }
            try
            {
                foreach($item in $items)
                {
                    0..512 | ForEach-Object -Begin {$ht = [ordered]@{}}{
                        if($value = $currentfolder.GetDetailsOf($item,$_))
                        {
                            if($propname = $currentfolder.GetDetailsOf($null,$_))
                            {
                                $ht.Add($propname,$value)
                            }
                        }    
                    } -End {[PSCustomObject]$ht}
                }
            }
            catch
            {
                Write-Warning "Error while processing $($item.fullname) : $($_.exception.message)"
            }
        }
        }"'

print @cmd

exec xp_cmdshell @cmd
 

Комментарии:

1. Обычно ли работает такая многострочная команда? Сведите его к чему-то более простому, чтобы понять, в чем проблема (создайте рабочую однострочную строку, затем разделите ее на несколько строк без изменения фактического кода). Я подозреваю, что вы не можете сделать это таким образом. Если вы можете, вам все равно не нужно оборачивать его в другой блок сценариев. Также взгляните на -EncodedCommand параметр (он последний в списке, когда вы это делаете powershell /? )

2. «Это говорит мне, что мне не хватает фигурных скобок» пожалуйста, покажите нам полный текст сообщения об ошибке, которое вы получаете 🙂

3. Может быть, изменить }}{ на }; , или } -Process { ?

4. создайте скрипт по сетевому пути и запустите