#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 /…