После некоторых исследований того, как 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, когда они портят свой дочерний исполняемый файл, я действительно не вижу способа чтобы проверить это .. извините.
Кстати, мне очень понравился этот вопрос (особенно исследования), надеюсь, он вам поможет.
ИСТОЧНИКИ
- В чем разница между уровнями выполнения "asInvoker" и "highAvailable"?
- чтение файла манифеста приложения?
- https://docs.microsoft.com/en-us/visualstudio/deployment/trustinfo-element-clickonce-application?view=vs-2019#requestedexecutionlevel