我正在寻找一种方法来将当前会话的网络凭据捕获到我稍后可以传递的变量中...
重点是在我拥有帐户访问权限/特权的外域上执行命令,但源域和目标域之间没有信任。
首先,我们在使用runas命令生成的powershell内部运行(runas / netonly / user:domian \ account powershell
从这里我可以做我想要的所有事情,除了在任务调度程序中创建一个事件,而无需将用户名/密码硬编码到命令行中
invoke-command -computer $ destination -scriptblock {schtasks -ru domain \ account -rp password}
我希望做的是像
$ username =获取当前会话网络用户名($(whoami)显示实际的本地longon帐户,而不是生成PowerShell窗口的runas帐户)
$ password =获取执行RunAs命令时输入的密码
答案 0 :(得分:3)
从根据活动目录输入和验证的凭据创建安全令牌后,密码将不再保留。它无法在其他地方检索和重用。只剩下令牌。这是设计的。
<强>更新强>:
我进一步挖了一下以支持我的情况,并不是如上所述,但最终结果是一样的。与runas.exe
一起使用的密码似乎不可用。网络凭据不对AD进行验证,这是有意义的回顾,因为您经常使用/netonly
来处理远程,不受信任的域:根据定义,您无法验证远程凭据本地系统。来自MSDN:
以下是与LOGON_NETCREDENTIALS_ONLY
一起使用的标记CreateProcessWithLogonW
的信息。
登录,但仅使用网络上的指定凭据。新的 process使用与调用者相同的标记,但系统会创建一个 LSA中的新登录会话,并且该进程使用指定的 凭据作为默认凭据。
此值可用于创建使用不同集的进程 本地凭据远程远程。这很有用 域间场景,没有信任关系。
系统不验证指定的凭据。因此, 进程可以启动,但可能无法访问网络资源。
好的,因为它无法验证凭据并获得令牌,所以它必须将密码存储在内存中的某处,因为它必须稍后通过线路传递给SSPI等等。因此,我们可以从中获取它们吗?从runas.exe
启动的流程?我们来看看:
PS> runas /netonly /user:foo\bar powershell.exe
Enter the password for foo\bar: ******
我确实将foo\bar
用于上面的域和用户。如前所述,它没有经过验证。我输入12345
输入密码。上面这一行将启动powershell的新实例。因此,从这个新实例开始,我们来看看默认的网络凭证:
PS> [System.Net.CredentialCache]::DefaultNetworkCredentials
UserName Domain
-------- ------
哦,好吧,运气不好:没有。我的猜测是凭证在内核的某些加密部分内存中被保护,可能是LSA(本地安全机构)无法从窥探过程中获取。