Рабочие процессы Powershell, локальная установка программного обеспечения после отключения UAC?

#powershell

#powershell

Вопрос:

Итак, мне скучно и я пытаюсь узнать о рабочих процессах в Powershell, но что-то просто не щелкает. Итак, у меня есть скрипт, который запрашивает учетные данные администратора для открытия нового ШИКАРНОГО окна, затем вносит изменения в реестр, чтобы отключить UAC (только на время действия скрипта), затем вызываются некоторые установщики exe и MSI, расположенные на подключенном диске.

 import-module ActiveDirectory
$erroractionpreference = 'SilentlyContinue'

#Elevate running of script to Administrative
param([switch]$Elevated)
function Check-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Check-Admin) -eq $false)  {
if ($elevated)
{
# could not elevate, quit
}
 
else {
 
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}

#Workflow to restart the pc

Workflow reboot_and_continue {


#The following section allows for changing the UAC settings for the duration of the script
{
New-Variable -Name Key 
New-Variable -Name PromptOnSecureDesktop_Name 
New-Variable -Name ConsentPromptBehaviorAdmin_Name 
 
Function Set-RegistryValue($key, $name, $value, $type="Dword") {  
  If ((Test-Path -Path $key) -Eq $false) { New-Item -ItemType Directory -Path $key | Out-Null }  
       Set-ItemProperty -Path $key -Name $name -Value $value -Type $type  
}  
 
Function Get-RegistryValue($key, $value) {  
   (Get-ItemProperty $key $value).$value  
}  
 
$Key = "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem" 
$ConsentPromptBehaviorAdmin_Name = "ConsentPromptBehaviorAdmin" 
$PromptOnSecureDesktop_Name = "PromptOnSecureDesktop" 
 
Function Get-UACLevel(){ 
    $ConsentPromptBehaviorAdmin_Value = Get-RegistryValue $Key $ConsentPromptBehaviorAdmin_Name 
    $PromptOnSecureDesktop_Value = Get-RegistryValue $Key $PromptOnSecureDesktop_Name 
    If($ConsentPromptBehaviorAdmin_Value -Eq 0 -And $PromptOnSecureDesktop_Value -Eq 0){ 
        "Never notIfy" 
    } 
    ElseIf($ConsentPromptBehaviorAdmin_Value -Eq 5 -And $PromptOnSecureDesktop_Value -Eq 0){ 
        "NotIfy me only when apps try to make changes to my computer(do not dim my desktop)" 
    } 
    ElseIf($ConsentPromptBehaviorAdmin_Value -Eq 5 -And $PromptOnSecureDesktop_Value -Eq 1){ 
        "NotIfy me only when apps try to make changes to my computer(default)" 
    } 
    ElseIf($ConsentPromptBehaviorAdmin_Value -Eq 2 -And $PromptOnSecureDesktop_Value -Eq 1){ 
        "Always notIfy" 
    } 
    Else{ 
        "Unknown" 
    } 
} 
     
Function Set-UACLevel() { 
    Param([int]$Level= 2) 
 
    New-Variable -Name PromptOnSecureDesktop_Value 
    New-Variable -Name ConsentPromptBehaviorAdmin_Value 
 
    If($Level -In 0, 1, 2, 3) { 
        $ConsentPromptBehaviorAdmin_Value = 5 
        $PromptOnSecureDesktop_Value = 1 
        Switch ($Level)  
        {  
          0 { 
              $ConsentPromptBehaviorAdmin_Value = 0  
              $PromptOnSecureDesktop_Value = 0 
          }  
          1 { 
              $ConsentPromptBehaviorAdmin_Value = 5  
              $PromptOnSecureDesktop_Value = 0 
          }  
          2 { 
              $ConsentPromptBehaviorAdmin_Value = 5  
              $PromptOnSecureDesktop_Value = 1 
          }  
          3 { 
              $ConsentPromptBehaviorAdmin_Value = 2  
              $PromptOnSecureDesktop_Value = 1 
          }  
        } 
        Set-RegistryValue -Key $Key -Name $ConsentPromptBehaviorAdmin_Name -Value $ConsentPromptBehaviorAdmin_Value 
        Set-RegistryValue -Key $Key -Name $PromptOnSecureDesktop_Name -Value $PromptOnSecureDesktop_Value 
 
        Get-UACLevel 
    } 
    Else{ 
        "No supported level" 
    } 
     
} 
 
Export-ModuleMember -Function Get-UACLevel 
Export-ModuleMember -Function Set-UACLevel
}

set-uaclevel 0



#This section calls the installers from a network share and runs them locally


Invoke-Command -ComputerName $env:COMPUTERNAME -ScriptBlock { Start-Process -FilePath "g:ITsoftwareChromeSetup.exe" -ArgumentList "/s" -Wait }
if ($setup.exitcode -eq 0)

Invoke-Command -ComputerName $env:COMPUTERNAME -ScriptBlock { Start-Process -FilePath "g:ITsupportNSG_Vipre_agent_ssi-mi.msi" -ArgumentList "-silent" -Wait }
if ($setup.exitcode -eq 0)

Invoke-Command -ComputerName $env:COMPUTERNAME -ScriptBlock { Start-Process -FilePath "G:ITsoftwarespiceworksinstall_collection.bat" -Wait }
if ($setup.exitcode -eq 0)
  

Строка 25 — это то, где я собираюсь попытаться представить рабочий процесс .. но, если подумать, было бы лучше охватить все это в рабочем процессе… Я просто не знаю.

Я пробовал искать, но просто не могу найти примеров установки программного обеспечения с использованием рабочего процесса. идея состоит в том, чтобы запустить окно powershell с правами администратора, отключить UAC, а затем перезагрузить компьютер. После запуска резервного копирования вызовите различные установщики, затем снова включите UAC и снова перезагрузитесь. Спасибо!

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

1. Обратите внимание, что рабочие процессы Windows PowerShell были представлены в версии v3, но так и не были по-настоящему запущены. Учитывая, что они больше не доступны в PowerShell [Core] v6 , куда будут направлены все будущие усилия по разработке, я думаю, будет справедливо назвать это устаревшей технологией.

2. О, ничего себе .. вчера, читая о рабочих процессах, я не видел ничего подобного. Честно говоря, я не ищу здесь супер долговечности. Если они будут поддерживаться в Win10, по крайней мере, в течение следующего года, я буду счастлив. Если вы не знаете другого метода?

3. В объявлении ядра PowerShell перечислены рабочие процессы среди технологий, которые больше не поддерживаются. Хотя отдельные технологии не идентифицируются с точки зрения того, мертвы ли они навсегда или могут вернуться, вы можете сделать вывод, что рабочие процессы мертвы, исходя из того факта, что было принято преднамеренное решение не переносить базовую технологию WF (Windows Workflow Foundation) на .NET Core .

4. (Вышесказанное было сделано только для лучшей поддержки утверждения об устаревании.) Что касается альтернатив: я сам никогда не использовал рабочие процессы, но, возможно, в этом сообщении приведены указатели.

5. Понял и спасибо за информацию. Думаю, я придумаю что-нибудь еще для этого. Я нашел сайт, который объясняет, как можно программно обойти UAC, который выглядит многообещающим: woshub.com /…