Você precisa de alguma saída de depuração. Também posso sugerir que você substitua seu código de construção de string pela formatação "-f", a'la sprintf () em outros idiomas. Isso torna as coisas mais fáceis de ler / depurar / modificar, por exemplo:
$Displayname = $User.Firstname + " " + $User.Lastname
... torna-se:
$DisplayName = ( "{0} {1}" -f $User.Firstname, $User.Lastname );
Parece que o seu erro está no atributo "name". Eu acredito que isso mapeia o atributo "CN" no AD, mas eu posso estar errado. Adicionar alguma depuração como a seguinte ajudaria:
Write-Host -Object ( "Attempting to create user with name ""{0}"" and display name ""{0}""" -f $DisplayName );
E, finalmente, você pode perder as aspas na chamada real de Novo-ADUser. O motivo é que você está passando variáveis, em vez de pedir ao PowerShell para interpretar seu código.
Se você pode postar alguma saída de depuração, isso seria muito útil ...