我试图用一堆函数创build一个模块,但是我遇到了一个问题:有时我需要运行与当前凭证不同的函数。 但事情是:如果我没有指定用户名,我不想要求凭证。 喜欢这个:
function MyFunction ($ComputerName='localhost',$UserName) { if ($UserName) { Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ComputerName -Credential $UserName } else { Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ComputerName } }
我能以某种方式摆脱if语句吗? 我可以让函数使用当前的凭据,除非我指定-UserName ?
如果我这样离开它:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ComputerName -Credential $UserName
并且在不指定-UserName情况下调用一个函数,每次都要求凭证。 是的,如果我closures“get-cred”框,它会使用current,但这不是我想要的。
Powershell获取凭据失败
在命令行validation域凭据
PowerShell启动notepad.exe和命令窗口启动并消失
获取Stop-NlbClusterNode:找不到与参数名称“Credential”相匹配的参数。 停止节点时出现错误
Git凭据助手不起作用
我将如何在Powershell的每个循环中保存凭证
Powershell多个凭据设置
SO_PEERCRED vs SCM_CREDENTIALS – 为什么有两个呢?
您可以使用获取的默认凭证填充具有当前凭证的PSCredential对象,如下所示:
if ($UserName) { $cred = get-credential $username # this prompts for credentials } else { $cred=[PSCredential][System.Net.CredentialCache]::DefaultCredentials }
然后,只需要使用-credential $cred而无需构建if的墙。
编辑:显然,由于当前用户的PSCredential对象的密码为由同一用户的私钥加密的securestring ,如果能够从默认凭证对象中获取PSCredential ,他将能够将密码解密为明文,所以这个洞存在,但最终关闭。 (也许让这个答案挂在这里,这样人们就不会像我那样得到asme的错误) 这个问题有关于这里产生的问题的标准答案。
另一种方法可能是使用splatting的变体,由Ansgar Wiechers详细解释,在这里只在单个if语句中构造凭证块,然后在需要的地方使用该块,而不是直接-credential参数。
$creds=@{} if ($UserName) { $cred = get-credential $username # this prompts for credentials $creds['Credential']=$cred }
然后在需要备用凭证的地方添加@creds:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ComputerName @creds
这样,如果提供了$UserName ,那么您将被要求输入用户密码,然后$creds将为空或包含$UserName有效凭证,因此所有随后的if都可以通过显式添加@creds来替换。
您可以使用splatting来动态构建参数列表,但是您仍然需要一个if语句来决定是否添加-Credential参数:
function MyFunction ($ComputerName='localhost',$UserName) { $params = @{ Class = 'Win32_OperatingSystem' ComputerName = $ComputerName } if ($UserName) { $params['Credential'] = $UserName } Get-WmiObject @params }
你永远不会失去IF ,但你可以创建一个字符串,然后调用它作为和表达式:
如果$UserName是$null那么凭证参数将不会被添加到表达式中。
function MyFunction ([String]$ComputerName='localhost',[String]$UserName) { Invoke-Expression ("Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ComputerName $(IF($UserName){'-Credential $UserName'})") }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。