Não conheço nenhuma ferramenta existente que realmente acione a criação. Embora, como Nic mencionou, seja hipoteticamente possível escrever algo que possa fazer isso.
Mas, de forma realista, com que frequência os usuários / grupos são criados fora de processos já automatizados? Se ainda não estiverem, seus processos de provisionamento existentes devem ser aumentados para adicionar os atributos RFC2307 relevantes também descritos em < href="http://blogs.technet.com/b/dsix/archive/2009/04/16/integrating-unix-client-in-active-directory-using-ldap-part-i.aspx"> Postagem no blog do TechNet . Para os extragrandes que são criados manualmente, você pode ter um script executado em qualquer intervalo que você goste que procure por objetos que estejam faltando os atributos e preenchendo-os conforme necessário.
Em nosso ambiente, o script que temos é executado a cada 5 minutos no DC que contém a função Emulador de PDC. Mas provavelmente poderíamos reduzi-lo a uma vez por minuto sem muito impacto adicional. Também geramos nossos valores de UID / GID a partir de um algoritmo baseado no SID do objeto, em vez de um simples valor de incremento automático. Ele tem o benefício de ser exclusivo * entre domínios / florestas e não precisamos fazer nenhuma pesquisa para encontrar o próximo valor ou garantir que o valor que queremos usar já não esteja em uso. Eu posso postar essa função se você quiser. Mas parece que vocês já podem ter seu próprio sistema para isso.
* Garantido = tanto quanto você pode garantir que dois domínios não serão criados com o mesmo ID de domínio gerado aleatoriamente.
Editar: por solicitação, aqui está a função Powershell que usamos para gerar UIDs / GIDs de um SID.
function Get-UidFromSid()
{
[CmdletBinding()]
param(
[Parameter(Mandatory=$true,Position=0,ValueFromPipeline,ValueFromPipelineByPropertyName)]
[System.Security.Principal.SecurityIdentifier]$sid
)
# convert sid to byte array
$sidBytes = New-Object byte[] $sid.BinaryLength
$sid.GetBinaryForm($sidBytes, 0)
Write-Verbose ("SID bytes: $([System.BitConverter]::ToString($sidBytes))")
# copy the sections we need
$ridDomainBytes = New-Object byte[] 8
[System.Array]::Copy($sidBytes, 16, $ridDomainBytes, 0, 4)
$ridUserBytes = New-Object byte[] 8
[System.Array]::Copy($sidBytes, 24, $ridUserBytes, 0, 4)
Write-Verbose ("Domain portion: $([System.BitConverter]::ToString($ridDomainBytes))")
Write-Verbose ("User portion: $([System.BitConverter]::ToString($ridUserBytes))")
# fix endian'ness if necessary
if (![System.BitConverter]::IsLittleEndian)
{
[System.Array]::Reverse($ridDomainBytes)
[System.Array]::Reverse($ridUserBytes)
}
# convert the byte arrays to longs
$ridDomain = [System.BitConverter]::ToInt64($ridDomainBytes, 0);
$ridUser = [System.BitConverter]::ToInt64($ridUserBytes, 0);
Write-Verbose "Domain(Int64) = $ridDomain, User(Int64) = $ridUser"
# Now we're going to use the first 9 bits of the domain rid followed by the
# first 22 bits of the user rid to make a single 31 bit integer (32-bit signed)
# that will be the new unique UID value for this SID
$ridDomain = ($ridDomain -band 0x1ff) -shl 22
$ridUser = $ridUser -band 0x3fffff
Write-Verbose "Domain(Int64) = $ridDomain, User(Int64) = $ridUser"
return ($ridDomain + $ridUser)
<#
.SYNOPSIS
Calculate the UID value for a Windows SID.
.DESCRIPTION
This function duplicates Centrify's algorithm for generating unique UID
values for Active Directory users and groups. The original algorithm was
provided by Centrify and ported to PowerShell by Ryan Bolger.
.PARAMETER sid
The SecurityIdentifier (SID) object to calculate against.
.OUTPUTS
System.Int32 value of the resulting UID.
.EXAMPLE
Get-UidFromSid ([System.Security.Principal.SecurityIdentifier]'S-1-5-21-3040497277-3966670145-4188292625-1137')
Calculate a UID from a fictional SID.
.EXAMPLE
Get-ADUser myuser | Get-UidFromSid
Calculate a UID from an existing Active Directory user via pipeline input.
#>
}