Проверьте, выполняется ли данный процесс с повышенными правами с powershell и Get-WmiObject - PullRequest
0 голосов
/ 10 апреля 2020

Мне нужно выполнить следующую часть моего скрипта:

$active_processes = (Get-WmiObject -Class Win32_Process | where path -like $path | Select-Object -ExpandProperty Path | split-path -leaf | Select-Object -Unique)

Все работает нормально, но мне нужно проверить, работает ли процесс, который я получаю после запуска всего скрипта с повышенными правами на запустить другой процесс с повышенными правами, если это необходимо, чтобы он мог взаимодействовать с указанным процессом. Я не вижу никакой информации о повышенных правах с Get-WmiObject, мне было интересно, пропускаю ли я ее или есть ли другой способ получить эту информацию

Мне не нужно запускать скрипт powershell как администратор. Что мне нужно, так это найти любой исполняемый файл, которому требуются повышенные права при запуске, и мне нужно найти эту информацию с помощью powershell.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

После некоторых исследований того, как windows знает, нужен ли ему администратор для запуска исполняемого файла, я пришел к выводу, что есть несколько способов, но наиболее рекомендуемым и надежным является чтение исполняемого манифеста, поэтому я написал следующую функцию:

function Get-ManifestFromExe{
    Param(
    [Parameter(Mandatory=$true,Position=0,ValueFromPipelineByPropertyName=$true)]
    [Alias("Path")]
    [ValidateScript({Test-Path $_ -IsValid})]
    [String]$FullName
    )
    begin{
        $stringStart = '<assembly'
        $stringEnd = 'assembly>'
    }
    process{
        $content = Get-Content $FullName -Raw
        $indexStart = $content.IndexOf($stringStart)
        $content = $content.Substring($indexStart)
        $indexEnd = ($content.IndexOf($stringEnd)) + $stringEnd.Length
        $content = $content.Substring(0,$indexEnd)
        if($content -match "$stringStart(.|\s)+(?=$stringEnd)$stringEnd"){
            return [XML]$Matches[0]
        } 
    }
}

function Test-IsAdminRequired{
    Param(
    [Parameter(Mandatory=$true,Position=0)]
    [XML]$xml
    )
    $value = $xml.assembly.trustInfo.security.requestedPrivileges.requestedExecutionLevel.level
    if(-not [String]::IsNullOrEmpty($value)){
        return ($value -eq "requireAdministrator" -or $value -eq "highestAvailable")
    }else{
        Write-Error "Provided xml does not contain requestedExecutionLevel node or level property"
    }
}

$exe = '.\Firefox Installer.exe'
Get-ManifestFromExe -Path $exe
Test-IsAdminRequired -xml $exeManifest

Он работает путем извлечения манифеста XML из исполняемого файла и проверки свойства уровня узла requiredExecutionLevel, значения, принятые для этого свойства, находятся на этой странице и приведены здесь:

asInvoker , не запрашивая никаких дополнительных разрешений. Этот уровень не требует дополнительных запросов доверия.

самое высокое Доступно , запрашивающее самые высокие разрешения, доступные родительскому процессу.

requireAdministrator , запрашивающий полные права администратора.

Итак, из этого мы можем заключить, что только highestAvailable и requireAdministrator будут нуждаться в привилегиях администратора, поэтому я проверяю их, с этим мы будет сделано ЗА ИСКЛЮЧЕНИЕМ , что некоторые тестируемые мной исполняемые файлы (в основном установщики) не требуют запуска администратора, но вместо этого они запрашивают UA C, когда они портят свой дочерний исполняемый файл, я действительно не вижу способа чтобы проверить это .. извините.

Кстати, мне очень понравился этот вопрос (особенно исследования), надеюсь, он вам поможет.


ИСТОЧНИКИ

  1. В чем разница между уровнями выполнения "asInvoker" и "highAvailable"?
  2. чтение файла манифеста приложения?
  3. https://docs.microsoft.com/en-us/visualstudio/deployment/trustinfo-element-clickonce-application?view=vs-2019#requestedexecutionlevel
0 голосов
/ 10 апреля 2020

Это в System.Security.Principal классах. Возвращает значение $ true, если текущий пользователь повышен до уровня локального администратора:

(New-Object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

...