Start-Process, mklink и зашифрованные / сохраненные учетные данные, о боже - PullRequest
0 голосов
/ 21 ноября 2018

Я работаю над тем, чтобы создать символическую ссылку в качестве обычного пользователя, чтобы разрешить ситуацию, изложенную здесь .Я создал файл паролей и ключ AES, как показано здесь .И у меня есть этот код, который без всяких учетных данных, но запускается с повышенного уровня ISE, работает как задумано, создавая символическую ссылку в корне C, которая указывает на созданную папку в корне C. Но, когда запуск выполняется без изменений, он не 't не создайте символическую ссылку, и при этом она не выдаст какую-либо ошибку.Он действует так же, как если бы учетные данные не использовались.

$passwordFile = "\\Mac\Support\Px Tools\x_PS Dev\SymLink_password.txt"
$keyFile = "\\Mac\Support\Px Tools\x_PS Dev\SymLink_AES.key"
$user = 'Px_Install'
$key = Get-Content $keyFile
$credential = New-Object -typeName:System.Management.Automation.PSCredential -argumentList:@($user, (Get-Content $passwordFile | ConvertTo-SecureString -key:$key))

if (-not (Test-Path 'C:\_Real')) {
    New-Item 'C:\_Real' -itemType:directory > $null
}
if (-not (Test-Path 'C:\_Real\real.txt')) {
    New-Item 'C:\_Real\real.txt' -itemType:file > $null
}
try {
    Start-Process -filePath:cmd.exe -windowStyle:hidden -argumentList:('/c', 'mklink', '/d', 'C:\C4RLink', "`"C:\_Real`"") -credential:$credential -errorAction:stop
} catch {
    Write-Host "Error"
}

Итак, я предполагаю три вопроса.

1: Есть ли способ проверить достоверность созданных учетных данных?Я использовал $credential.GetType и он возвращает

OverloadDefinitions
-------------------
type GetType()  

Что может быть или не быть правильным, не уверен.

2: Что-то не так с моим использованием Start-Process?

3: Есть ли способ на самом деле перехватывать значимые ошибки, или же cmd.exe настолько примитивен, что я застрял, проверяя, существует ли ссылка после запуска и выдает собственную ошибку?Я попытался

$results = Start-Process -filePath:cmd.exe -windowStyle:hidden -argumentList:('/c', 'mklink', '/d', 'C:\C4RLink', "`"C:\_Real`"") -credential:$credential -errorAction:stop -passThru
Write-Host "$results"

, и он выдает System.Diagnostics.Process (cmd), что не очень полезно.

Говоря о Windows 7, я только что протестировал его в Windows 7 / PS2.0, и он ДЕЛАЕТвыдает ошибку, но в Windows 10 это не так.Gawd Micros0ft, вы не можете собрать свое дерьмо, когда-либо?но, может быть, нить, чтобы следовать.Также собираюсь попытаться получить учетные данные другим способом, чтобы исключить эту переменную.

FWIW, я попытался НЕ оборачивать список аргументов в массив, фактически я начал с этого.Но это не сработало, поэтому я попробовал массив на жаворонке.

РЕДАКТИРОВАТЬ: Таким образом, попытка его в Windows 7 выдает ошибку, которая составляет Parameter set cannot be resolved using the specified named parameters. Я также понял, что мне нужно -verb: Runas втам.Добавил это и переключил мои учетные данные на использование Get-Credential.Но все еще получаю проблемы с набором параметров.Вздох.

Edit2: похоже, не нравится -verb или -windowsStyle в Windows 7 / PS2.0.Я думаю, последнее не составляет особого труда, но -verb в значительной степени требуется для того, чтобы заставить его работать с метинками.

Edit3: нет, похоже, не нравится -verb в Windows 10.Но теперь у меня есть отчет об исключениях, так что это форма прогресса.

EDIT4: все ближе.Теперь у меня есть это

Start-Process powershell -credential (Get-Credential 'Px_Install') -argumentList "-noprofile -command &{Start-Process -filePath cmd.exe -argumentList '/c', 'mklink', '/d', 'C:\C4RLink', 'C:\_Real' -verb runas}"

И оно работает, но вызывает диалоговое окно UAC, что делает его практически бесполезным.

...