我正在为我们的服务台处理一个带有数据库后端的小型工作单应用程序。其中一部分是跟踪有关我组织笔记本电脑的一些基本信息(制造商,型号,序列号,分配给谁等)。我会使用像C#或Java这样的真正的编程语言,但由于人们的头脑,我仍然坚持使用Windows 10企业版中内置的内容,因此使用WPF的PowerShell。
我们的网络具有Windows域,其中包含大型Active Directory林和智能卡身份验证。如果可能,我想做的是让用户选择他们的智能卡证书(使用此应用程序的用户将与登录Windows的用户不同,即将插入多个智能卡),并提供UAC提示或获取-Credential提示。输入他们的图钉并不是必需的,尽管确认他们的身份会很好。我想要的只是从他们选择的证书/卡中检索一些基本信息,例如显示名称和电子邮件地址。我将使用电子邮件地址查询我的数据库以获取其他信息,例如他们分配的笔记本电脑。如果可能的话,我想避免进行Active Directory查找,但该选项并非完全脱离桌面。
以下是我发现的一些事情,但它们都是我尝试做的部分解决方案,而且我不确定如何将它们放在一起。 Get-Credential会提示用户选择一张智能卡并输入他们的PIN码,这样就可以完成我之前正在寻找的东西,但在后面它会返回一个包含用户名的PSCredential对象(不知怎的,但是我可以&# 39;找到使用的编码,或者可能是UID)和SecureString密码(未经过验证,用户可以留空或输入任何内容)。我不知道如何处理这个以获取我想要的信息。 Get-ADUser似乎无法使用PSCredential对象作为标识返回用户对象。有什么我缺少或不理解这个?我试图做的是什么?
View All Certificates On Smart Card
https://www.akaplan.com/blog/2013/10/get-users-mailaddress-from-smartcard-with-powershell/
https://blogs.msdn.microsoft.com/alejacma/2010/12/15/how-to-enumerate-all-certificates-on-a-smart-card-powershell/ 这最后一个链接似乎可行,但我不确定如何使用它。文档非常稀少。
答案 0 :(得分:4)
如果我想使用基于当时插入的智能卡的证书,我会使用certutil.exe来提取所有智能卡信息。然后从结果文本中获取证书序列号,并查询与序列号匹配的CurrentUser \ MY证书库。获得证书后,我会使用Out-GridView
参数将该信息传递给-OutputMode Single
,以允许用户选择证书。从那里,您可以根据显示的证书获得用户的信息。
$SCSerials = certutil -scinfo -silent | Where{$_ -match 'Serial Number: (\S+)'} | ForEach {$Matches[1]}
$SelectedThumb = Get-ChildItem Cert:\CurrentUser\my | Where{$_.SerialNumber -in $SCSerials} | Select Subject,Issuer,NotBefore,NotAfter,Thumbprint | Out-GridView -Title 'Select a smartcard certificate.' -OutputMode Single |% Thumbprint
$UserCert = Get-Item Cert:\CurrentUser\My\$SelectedThumb
然后$UserCert.Subject
是用户的专有名称,您可以使用它来查询AD或任何您想要的内容。