我想在 C# 程序中自动执行一些管理任务,为此我需要获取凭据(具有所需权限的域用户的用户名和密码,例如管理员)。然后我想安全地存储“登录名”,这样我就不必为我想要执行的每项任务都询问它。我知道有多种索要凭据的官方方法(例如
CredUIPromptForWindowsCredentials
或 Powershell 的 Get-Credential
),但这些以明文形式(或作为安全字符串)返回用户名和密码,我必须自己安全地存储这些信息。
有没有办法获得一种登录令牌,允许我在远程计算机上执行操作,而无法恢复密码?我正在寻找相当于 Kerberos 票证授予票证的 Windows 版本 - 你可以
kinit
,输入您的密码,并获取一张在网络上对您进行身份验证的票证,而无需再次使用您的密码(票证将在设定的时间后过期)。
我想到的一个解决方法是不自己处理凭据,而是直接使用 Window 的身份验证并以不同的用户身份运行子进程。缺点是这会使我的应用程序变得更加复杂,并且它只能在同一域内工作。
为了澄清,我想使用各种管理界面(WMI、Powershell 远程处理、PSExec),并且它最好可以在任何计算机上工作,即使在目标计算机域之外也是如此。 “令牌”的生命周期至少是我的程序的运行时间,但如果我可以将“令牌”保存到磁盘并每天多次重复使用它也会很有用。
您是否尝试过 Windows 凭据管理器?
您可以将凭据存储在 Windows 凭据管理器中一次,然后使用 PowerShell 以编程方式访问它。这是 Microsoft 在本地存储凭据的安全方式。
在 Windows 计算机上安装凭据管理器
Install-Module -Name Credential Manager
使用 powershell 存储新凭据
New-StoredCredential -Target Contoso -Username User1 -Password Password
还有另一种方法可以在凭据管理器中存储新密码
Get-Credential -Username User2 -Message “Please enter your password:” | New-StoredCredential -Target Contoso
然后要检索存储的凭据,请使用 Get-StoredCredential
$Cred = Get-StoredCredential -Target Contoso
不幸的是,凭证管理器模块附带的文档并不多,但您可以通过以下命令获取更多详细信息
Get-Help Get-StoredCredential
这就是通用凭证。如何制作 Windows (Kerberos) 凭据?