Я работаю над тем, чтобы создать символическую ссылку в качестве обычного пользователя, чтобы разрешить ситуацию, изложенную здесь .Я создал файл паролей и ключ 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, что делает его практически бесполезным.