Как запустить программу от имени другого пользователя и добавить аргументы в powershell? - PullRequest
0 голосов
/ 24 апреля 2018

У нас есть программа, которая обновляется только при запуске с переключателем /t из учетной записи администратора.

Я придумал версию приглашения CMD, но я новичок в powershell и с трудом перевожу ее на Powershell.

Версия CMD:

C:\Windows\System32\runas.exe /savecred /user:ourdomain\ouruseracct "C:\Program Files (x86)\ProjectMatrix\ProjectNotify\ProjectNotify.exe /t"

Пока я получил:

C:\Windows\System32\runas.exe /user:ourdomain\ouruseracct /savecred "powershell -c start-process -FilePath \"'C:\Program Files (x86)\ProjectMatrix\ProjectNotify\ProjectNotify.exe'\" -verb runAs"

, который запускает powershell от имени администратора и запускает программу от имени администратора, но нам нужно передать аргумент -t или /t в projectnotify.exe при его запуске.

Я считаю, что нам нужно использовать -argumentlist, но не знаю, как это сформулировать.

Я пытался

$t = "-t"
Start-Process -FilePath "C:\Program Files (x86)\ProjectMatrix\ProjectNotify\projectnotify.exe" -ArgumentList $t -Verb runas

Который запускает программу, но не уверен, что именно так вы передаете аргумент.

1 Ответ

0 голосов
/ 24 апреля 2018

Дополнительная работа (устранение неполадок):

$Cred = Get-Credential
$ProcInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo'

$ProcInfo.Domain = $Cred.GetNetworkCredential().Domain
$ProcInfo.UserName = $Cred.UserName
$ProcInfo.Password = $Cred.Password
$ProcInfo.FileName = "${Env:ProgramFiles(x86)}\ProjectMatrix\ProjectNotify\ProjectNotify.exe"
$ProcInfo.Arguments = '/t'
$ProcInfo.WorkingDirectory = "${Env:ProgramFiles(x86)}\ProjectMatrix\ProjectNotify"
$ProcInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Normal
$ProcInfo.Verb = 'RunAs'
$ProcInfo.UseShellExecute = $true

[System.Diagnostics.Process]::Start($ProcInfo)

Подумав еще немного, вот более простой способ (даже в одной команде):

Start-Job -Credential (Get-Credential) -ScriptBlock {
    $Dir = "${Env:ProgramFiles(x86)}\ProjectMatrix\ProjectNotify"

    $StartArgs = @{
        'FilePath' = "$Dir\ProjectNotify.exe"
        'ArgumentList' = '/t'
        'Verb' = 'RunAs'
        'WindowStyle' = 'Normal'
        'WorkingDirectory' = $Dir
        'PassThru' = $true
    }
    Start-Process @StartArgs
} | Wait-Job | Receive-Job

Мой предыдущий ответсейчас внизу этого поста.


Ссылки:

Дополнительные показания:

Принимая скрипт по требованию, вы должны создать *Объект 1044 *, если вы хотите запустить его из powershell:

Launch.cmd

SET "PS=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe"
SET "SCRIPT=%SYSTEMDRIVE%\Path\to\wrapper.ps1"

%PS% -NoProfile -NoLogo -ExecutionPolicy Bypass -File "%SCRIPT%"

wrapper.ps1

$Cred = Get-Credential

# To avoid prompting every time:
#
# if (-not (Test-Path -Path '.\mycred.xml')) {
#     Get-Credential | Export-CliXml -Path '.\mycred.xml'
# }
# $Cred = Import-CliXml -Path '.\mycred.xml'

$StartArgs = @{
    'FilePath' = "$PSHOME\powershell.exe"
    'ArgumentList' = '-NoProfile', '-NoLogo', '-File', '.\runas.ps1'
    'Credential' = $Cred
}
Start-Process @StartArgs

runas.ps1

$StartArgs = @{
    'FilePath' = "${Env:ProgramFiles(x86)}\ProjectMatrix\ProjectNotify\ProjectNotify.exe"
    'ArgumentList' = '/t'
    'Verb' = 'RunAs'
}
Start-Process @StartArgs
...