上下文:在PowerShell中工作,需要PSCredential对象,具有WindowsIdentity类型的对象。

假设您使用以下方法获取WindowsIdentity类型:

“[Security.Principal.WindowsIdentity]::GetCurrent()”

您需要PSCredential对象进行网络调用,例如Invoke-RestMethod。

代替调用通常的Get-Credential并提示用户输入用户名和密码,我们可以实际使用当前的安全上下文来创建凭据对象吗?例如,我们是否可以将WindowsIdentity对象转换为PSCredential(如果不是直接转换,则需要通过一系列步骤进行转换?)。

如果不是,那么关于从当前安全上下文中创建PSCredential对象的任何其他想法(不指定用户名或密码-或存储加密的用户名和密码,因为密码更改也需要更新)?

类似的问题可能以前曾被问过,但我找不到试图将WindowsIdentity转换为PSCredential类型的方法-或关于为​​什么设计上可能阻止它的任何明确答案。如果从根本上不可能做到这一点-不支持它的原因可能是什么?您看到任何可行的解决方法吗?
(我尝试添加一个标签:PSCredential,但是此标签尚不存在,并且我没有足够的声誉来创建它:我想添加该标签:也许社区中的某人可以添加它。谢谢。)

最佳答案

我相信其他人会对此采取行动,但是据我了解,这里有一些事情会使这成为真正的挑战,而不是作为运营协议(protocol)的审慎做法。

[Security.Principal.WindowsIdentity]::GetCurrent(),为您提供有关网络上已验证身份的信息。 它不包含有关用户密码的任何信息

(https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx),

System.Management.Automation.PSCredential 需要

(https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.pscredential?view=powershellsdk-1.1.0)。

记住,GetNetworkCredential的目标

(https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.pscredential.getnetworkcredential?view=powershellsdk-1.1.0#System_Management_Automation_PSCredential_GetNetworkCredential)

(当然,这是System.Management.Automation.PSCredential方法)是将用户名分解为单独的Domain和UserName字符串,并将凭据密码以明文形式交给您。

对于网络,客户端访问,如果没有提供有效密码,PSCredential将无法工作。当然,如果您亲自输入信息,则您(只有您自己)可以将其撤消,而不是某些远程人员或服务。

考虑一下。您能想象能够做到这一点的风险后果不减吗?

能够动态地提取当前登录用户的所有身份验证熵。这将是即时的ESP(模拟/特权升级)问题。密码混淆,长度,复杂性以及类似的方法将毫无意义。考虑Pth(通过类似Hash的攻击)的情况,而无需脚尖抓取哈希。

想象一下,触发与任何远程主机的远程 session (无论登录者是谁),利用您在此处声明的内容,从而冒充用户(具有其所有权利和特权)冒充非常邪恶的事情,甚至只是卑鄙的事情。 (更改他们的密码,桌面设置,ADDS属性,例如是否允许他们在其中更改图片,电话号码,姓氏等。所有这些都将像记录该用户一样记录在审核日志中)。您可以登录他们的个人人力资源文件,将信誉好的对象传递给HR网站,等等。我确信这不是您的意图(至少我希望不是),但仍然如此。

话虽如此,如果您是在模拟用户之后,那么有很多资源可以提供有关如何执行此操作的方法。但是,当您查看执行该操作的代码时,它所涉及的不仅仅是您在MS PowerShell画廊中所要求的,而且,甚至它希望您将其传递给一个真正可信的对象,而不是WI对象。

跨网络访问需要完整的身份,用户名和密码。每次尝试触摸尚未触及或很久没有触及的资源时,您的KDC(域 Controller )都会参与进来,并且没有完全的信任,KDC遏制TGT将会失败。

更新

苏威什

至于-



这是我所指的代码。

10-08 19:04