Попытка использовать New-ScheduledJob вместо New-ScheduledTask для добавления графического интерфейса PowerShell в Windows 7 - PullRequest
0 голосов
/ 04 марта 2019

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

Конкретные проблемы, с которыми я сталкиваюсь:

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

Сначала я включу рабочий сценарий, который использовался с командлетом schedulenewtask, а затем новый сценарий, которым я занимался до сих пор.неудачно с.

$A = New-ScheduledTaskAction -Execute "office_check_funct_test.ps1" -WorkingDirectory "C:\Users\user\Desktop\notify"
$T = New-ScheduledTaskTrigger -AtLogOn
$S = New-ScheduledTaskSettingsSet -StartWhenAvailable
$P = New-ScheduledTaskPrincipal -UserId "LOCALSERVICE" -LogonType ServiceAccount
$D = New-ScheduledTask -Principal $P -Action $A -Trigger $T -Settings $S

function Check_Program_Installed($programName) {
    $x86_check = ((Get-ChildItem "C:\Program Files (x86)\Microsoft Office") |
        Where-Object { $_."Name" -like "*$programName*" }).Length -gt 0;

    if (Test-Path 'C:\Program Files (x86)\Microsoft Office') {
        $x64_check = ((Get-ChildItem "C:\Program Files (x86)\Microsoft Office") |
            Where-Object { $_."Name" -like "*$programName*" }).Length -gt 0;
    }
    return $x86_check -or $x64_check;
}


$check = Check_Program_Installed("Office12")
if ($check -eq $false) {
    try {
        Register-ScheduledTask -InputObject $D -TaskName T1 -ErrorAction SilentlyContinue
    } catch {
    }

    Enable-ScheduledTask -TaskName T1 -ErrorAction SilentlyContinue

    Add-Type -AssemblyName System.Windows.Forms
    $config = '.\config.txt'

    $values = Get-Content $config | Out-String | ConvertFrom-StringData
    $values.textAlign
    # hashtable, hence this variable
    $values1 = Get-Content $config
    $values1[3]
    $res = (Get-WmiObject -Class Win32_VideoController).VideoModeDescription -split " x "
    $displayWidth = $res[0]
    $displayHeight = $res[1]

    $formWidth = $values.formWidth
    $formHeight = $values.formHeight
    $bufferWidth = $values.bufferWidth
    $bufferHeight = $values.bufferHeight

    $locX = $displayWidth - $formWidth - $bufferWidth
    $locY = $displayHeight - $formHeight - $bufferHeight

    $image = [system.Drawing.Image]::FromFile('.\logo.png')

    $form = New-Object System.Windows.Forms.Form
    $form.StartPosition = 'Manual'
    $form.ClientSize = "$($formWidth),$($formHeight)"
    $form.Location = "$($locX),$($locY)"
    $form.FormBorderStyle = 'FixedDialog'
    $form.MinimizeBox = $false
    $form.MaximizeBox = $false
    $form.BackgroundImage = $image
    $form.BackgroundImageLayout = 'None'
    $form.BackColor = $values.formBackColor
    $form.Opacity = $values.formOpacity

    $button1 = New-Object System.Windows.Forms.Button
    $button1.Visible = $true
    $button1Width = $values.button1Width
    $button1Height = $values.button1Height
    $button1.DialogResult = 'OK'
    $button1.Size = "$($button1Width),$($button1Height)"
    $button1.Font = $values.buttonFont
    $button1.Text = $values.buttonText
    $buttonLocX = $values.buttonLocX
    $buttonLocY = $values.buttonLocY
    $button1.Location = "$($buttonLocX),$($buttonLocY)"
    $button1.BackColor = $values.buttonBackColor
    $button1.ForeColor = $values.buttonForeColor

    $text = Get-Content -PSPath '.\message.txt'
    $lableLocX = $values.textBoxLocX
    $lableLocY = $values.textBoxLocY
    $label2 = New-Object System.Windows.Forms.Label
    $label2.Text = $text
    $label2.Font = $values.font
    $label2.Size = $values.textBoxSize
    $label2.Location = "$($lableLocX),$($lableLocY)"
    $label2.BackColor = $values.textBoxBackColor
    $label2.ForeColor = $values.textColor

    $label2.TextAlign = $values1[3] -split 'textAlign= ' | Out-String

    $Icon = [system.drawing.icon]::ExtractAssociatedIcon(".\star_logo.ico")
    $form.Icon = $Icon

    $form.Controls.AddRange(@($button1, $label2))
    [void]$form.ShowDialog()
} elseif ($check -eq $true) {
     Disable-ScheduledTask -TaskName T1
}
function Check_Program_Installed($programName) {
    $x86_check = ((Get-ChildItem -ErrorAction SilentlyContinue "C:\Program Files (x86)\Microsoft Office\Office12") |
        Where-Object { $_."Name" -like "*$programName*" }).Length -gt 0;

    if (Test-Path -ErrorAction SilentlyContinue 'C:\Program Files (x86)\Microsoft Office\Office12') {
        $x64_check = ((Get-ChildItem -ErrorAction SilentlyContinue "C:\Program Files (x86)\Microsoft Office\Office12") |
            Where-Object -ErrorAction SilentlyContinue { $_."Name" -like "*$programName*" }).Length -gt 0;
    }
    return $x86_check -or $x64_check;
}

$check = Check_Program_Installed("excel")
if ($check -eq $false) {
    try {
        $S = New-ScheduledJobOption -RunElevated -ContinueIfGoingOnBattery
        $logon = New-JobTrigger -AtLogOn

        $account = New-Object System.Management.Automation.PSCredential "domain/user"
        Register-ScheduledJob -ErrorAction SilentlyContinue -FilePath C:\doucments\scripts\test_job.ps1 -argument form -Name TestJob4 -ScheduledJobOption $S -Trigger $logon -Credential $account
    } catch {
    }

    try {
        Enable-ScheduledJob -ErrorAction SilentlyContinue -Name TestJob1
    } catch {
    }
    Add-Type -AssemblyName System.Windows.Forms
    $config = '.\config.txt'

    $values = Get-Content $config | Out-String | ConvertFrom-StringData
    $values.textAlign

    $values1 = Get-Content $config
    $values1[3]
    $res = (Get-WmiObject -Class Win32_VideoController).VideoModeDescription -split " x "
    $displayWidth = $res[0]
    $displayHeight = $res[1]

    $formWidth = $values.formWidth
    $formHeight = $values.formHeight
    $bufferWidth = $values.bufferWidth
    $bufferHeight = $values.bufferHeight

    $locX = $displayWidth - $formWidth - $bufferWidth
    $locY = $displayHeight - $formHeight - $bufferHeight

    $image = [system.Drawing.Image]::FromFile('.\logo.png')

    $form = New-Object System.Windows.Forms.Form
    $form.StartPosition = 'Manual'
    $form.ClientSize = "$($formWidth),$($formHeight)"
    $form.Location = "$($locX),$($locY)"
    $form.FormBorderStyle = 'FixedDialog'
    $form.MinimizeBox = $false
    $form.MaximizeBox = $false
    $form.BackgroundImage = $image
    $form.BackgroundImageLayout = 'None'
    $form.BackColor = $values.formBackColor
    $form.Opacity = $values.formOpacity

    $button1 = New-Object System.Windows.Forms.Button
    $button1.Visible = $true
    $button1Width = $values.button1Width
    $button1Height = $values.button1Height
    $button1.DialogResult = 'OK'
    $button1.Size = "$($button1Width),$($button1Height)"
    $button1.Font = $values.buttonFont
    $button1.Text = $values.buttonText
    $buttonLocX = $values.buttonLocX
    $buttonLocY = $values.buttonLocY
    $button1.Location = "$($buttonLocX),$($buttonLocY)"
    $button1.BackColor = $values.buttonBackColor
    $button1.ForeColor = $values.buttonForeColor

    $text = Get-Content -PSPath '.\message.txt'
    $lableLocX = $values.textBoxLocX
    $lableLocY = $values.textBoxLocY
    $label2 = New-Object System.Windows.Forms.Label
    $label2.Text = $text
    $label2.Font = $values.font
    $label2.Size = $values.textBoxSize
    $label2.Location = "$($lableLocX),$($lableLocY)"
    $label2.BackColor = $values.textBoxBackColor
    $label2.ForeColor = $values.textColor

    $label2.TextAlign = $values1[3] -split 'textAlign= ' | Out-String

    $Icon = [system.drawing.icon]::ExtractAssociatedIcon(".\star_logo.ico")
    $form.Icon = $Icon

    $form.Controls.AddRange(@($button1, $label2))
    [void]$form.ShowDialog()
} elseif ($check -eq $true) {
    Disable-ScheduledJob -Name TestJob3
}
...