我正在研究一种创建标准用户身份的Symlink的方法,以解决here概述的情况。 我创建了一个密码文件和一个AES密钥,如图here所示。 我有这段代码,它没有证书的内容,而是从提升的ISE运行,可以按预期工作,在C的根目录中创建一个符号链接,该符号链接指向C的根目录中创建的文件夹。 但是,当运行不提升时,它不会创建符号链接,也不会引发任何类型的错误。就像没有凭据在使用一样。
$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:我对启动过程的使用有问题吗?
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,永远都不能凑在一起吗?但是,也许有一个后续的话题。还将尝试以另一种方式获取凭据,以消除该变量。
首先,我尝试不将参数列表包装在数组中,实际上我是从此开始的。但这没有用,所以我在百灵鸟上尝试了该阵列。
编辑:因此,在Windows 7中尝试确实会产生错误,这是Parameter set cannot be resolved using the specified named parameters.
,我也意识到我在那里需要-verb:Runas。进行了补充,并暂时将我的凭据切换为使用Get-Credential。但是仍然出现参数集问题。叹气。
Edit2:似乎不喜欢Windows 7 / PS2.0中的-verb或-windowsStyle。我猜,后者没什么大不了的,但是-verb非常需要使它起作用才能使用方法。
Edit3:不,在Windows 10中似乎也不喜欢-verb。但是我现在要报告异常,所以这是一种进步。
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对话框,这几乎使它无用。