Powershell Set-ADUser userCertificate参数类型错误

时间:2017-03-24 17:18:18

标签: powershell active-directory

我有一个脚本,基本上执行以下操作:

$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}

1 个答案:

答案 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[]]CertificatesCertificates

的集合

因此,进行更改后,我可以将另一个用户证书添加到我自己的帐户中。

Security.Cryptography.X509Certificates.X509Certificate

注意:最好只从AD请求所需的属性。使用$certUser = Get-Aduser "someGuy" -Properties certificates $certUser.Certificates | %{ Set-ADUser "ME" -Certificates @{Add=$_}} 是浪费精力和不必要的资源

虽然没有涵盖这个确切的情况,但MSDN Blogs对于处理证书有一个很好的说明。

Cert as a byte array

既然我们知道-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