我有一个脚本,基本上执行以下操作:
$user = Get-ADUser $someUserName -Server $someCertServer -Properties *
$user.userCertificate |% { Set-ADUser $someUserName -Certificates @{Add=$_} }
它将证书数据从证书服务器复制到默认服务器。 $user.userCertificate
的类型为Microsoft.ActiveDirectory.Management.ADPropertyValueCollection
,$user.userCertificate[0]
的类型为System.Byte[]
。根据{{3}},我可以传递一个Byte[]
并且很好。通过在上面的脚本中使用foreach运算符,我得到了Byte []。
但是,Powershell失败并显示错误消息
参数证书要求集合中的所有值都属于同一类型
(并强调@{Add=$_}
;该消息可能不是100%准确,因为我必须将其翻译为英语)。由于foreach运算符,只有一种类型:字节[]。该错误消息的含义是什么?如何将证书推送到ADUser对象?
我还尝试将Byte []转换为证书对象,但最终却出现了相同的错误消息:
$cert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($user.userCertificate[0])
Set-ADUser $someUserName -Certificates @{Add=$cert}
答案 0 :(得分:1)
我看到的第一个问题是,您正在调用错误的属性以使您的示例正常工作。
class PostViewSet(ModelViewSet): queryset = Post.objects.all() def get_serializer_class(self): if self.action == 'create': return PostSerializerWithUserID else: return PostSerializerWithNestedUser
虽然该对象上有一个名为$user.userCertificate | ForEach-Object { Set-ADUser $someUserName -Certificates @{Add=$_}}
的属性,其中包含userCertificate
的集合。要使代码以您希望的方式工作,您应该使用[byte[]]
。 Certificates
是Certificates
因此,进行更改后,我可以将另一个用户证书添加到我自己的帐户中。
Security.Cryptography.X509Certificates.X509Certificate
注意:最好只从AD请求所需的属性。使用$certUser = Get-Aduser "someGuy" -Properties certificates
$certUser.Certificates | %{ Set-ADUser "ME" -Certificates @{Add=$_}}
是浪费精力和不必要的资源
虽然没有涵盖这个确切的情况,但MSDN Blogs对于处理证书有一个很好的说明。
既然我们知道-properties *
是一个字节数组的集合,我们可以研究如何使用它。
我在使用带有userCertificate
证书参数的字节数组时遇到了问题,即使它应该支持它。我收到了错误
Set-Aduser
我确实得到了这个工作,但是我必须首先将字节数组作为cert对象进行转换,这是多余的,因为这看起来似乎是Set-ADUser : Cannot validate argument on parameter 'Certificates'. Values in the argument collection should be of Type: 'System.Security.Cryptography.X509Certificates.X509Certificate'
属性。
Certificates