C# 保存Windows登录而不保存密码(如Kerberos票证)

C# 保存Windows登录而不保存密码(如Kerberos票证),c#,powershell,windows-authentication,C#,Powershell,Windows Authentication,我想自动化C#程序中的一些管理任务,为此我需要获取凭据(具有所需权限的域用户的用户名和密码,例如管理员)。然后我想安全地存储“登录”,这样我就不必为我想执行的每一项任务都要求它。我知道有多种官方方式可以请求凭据(例如CredUIPromptForWindowsCredentials,或Powershell的Get Credential),但这些方式会以明文(或SecureString)形式返回用户名和密码,我必须安全地存储自己 有没有办法获得一种登录令牌,允许我在远程计算机上执行操作,而不必恢复

我想自动化C#程序中的一些管理任务,为此我需要获取凭据(具有所需权限的域用户的用户名和密码,例如管理员)。然后我想安全地存储“登录”,这样我就不必为我想执行的每一项任务都要求它。我知道有多种官方方式可以请求凭据(例如
CredUIPromptForWindowsCredentials
,或Powershell的
Get Credential
),但这些方式会以明文(或SecureString)形式返回用户名和密码,我必须安全地存储自己

有没有办法获得一种登录令牌,允许我在远程计算机上执行操作,而不必恢复密码?我正在寻找与Kerberos票证授予票证相同的windows版本-您需要
kinit
,输入您的密码,并获得一张无需再次使用密码即可在网络上验证您身份的票证(票证在设定时间后过期)

我想到的一个解决方法是不亲自处理凭据,而是直接使用Window的身份验证,并以不同的用户身份运行子进程。缺点是这会使我的应用程序更加复杂,而且它只可能在同一个域中工作

为了澄清,我想使用各种管理接口(WMI、Powershell远程处理、PSExec),它最好在任何计算机上工作,即使在目标计算机的域之外。“令牌”的生命周期至少是我的程序的运行时间,但如果我可以将“令牌”保存到磁盘并一天重复使用多次,它也会很有用。

您尝试过这个吗

您可以在Windows凭据管理器中存储凭据一次,然后使用PowerShell以编程方式访问它。这是Microsoft在本地存储凭据的安全方式

在Windows计算机上安装凭据管理器

安装模块-名称凭据管理器

使用powershell存储新凭据的步骤

newstoredcredential-目标Contoso-用户名User1-密码

还有另一种方法可以在凭证管理器中存储新密码

Get Credential-用户名User2-消息“请输入您的密码:| New StoredCredential-目标Contoso

&然后使用Get-StoredCredential检索存储的凭据

$Cred=Get StoredCredential-Target Contoso

不幸的是,凭证管理器模块没有很多文档,但是您可以通过以下命令获得更多详细信息

Get Help Get StoredCredential


您可以从Windows API advapi32.dll模块中使用
LogonUser
ImpersonateLoggedOnUser
。LogonUser为您提供可用于模拟的令牌。但是,据我所知,它需要在目标计算机域中执行
LogonUser
ImpersonateLoggedOnUser
代码。但是,
LogonUser
需要纯文本的登录名和密码。我不确定您是否可以从未加入域的计算机中充当域用户。您可以编写服务,将其安装在域中的目标计算机上,并向服务发送命令,但我担心这与安全无关。“windows相当于Kerberos票证授予票证”>>这正是windows在绑定到Active Directory时使用的功能。。。只需在电脑上运行
klist.exe