plugin ou utilitário AD que gera um uidnumber / gidnumber exclusivo na criação

6

Estou procurando:

Um plug-in que gera automaticamente um valor de atributo exclusivo uidNumber para novos usuários e um valor de atributo exclusivo gidNumber para novos grupos na criação.

Um aplicativo de gerenciamento de usuário / grupo configurável que pode gerar os valores exclusivos acima, bem como preencher os vários outros atributos necessários para integração com o Linux

Apresentamos um script e uma página da Web feitos internamente para fazer tudo isso, mas estamos procurando algo que não precisamos manter e um pouco mais polido.

Alguém sabe de uma boa ferramenta que se encaixa no projeto?

Obrigado!

    
por jasonpvp 05.03.2013 / 17:17

2 respostas

3

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.
#>

}
    
por 12.01.2016 / 08:05
1

Você pode atribuir o atributo gidNumber de um script do PowerShell. Para torná-lo automático, chame o script como uma tarefa agendada. Escrevi um cmdlet chamado Initialize-GroupGids , que atribui lances exclusivos a grupos do AD e pode ser personalizado para diferentes ambientes com parâmetros.

Mas, basicamente, você pode fazer algo parecido com isso no PowerShell.

# Find the highest GID used on any group in the domain
$highGid = Get-ADGroup -LDAPFilter "(gidNumber=*)" -Properties gidNumber |
    Measure-Object -Property gidNumber -Maximum |
    Select-Object -ExpandProperty Maximum

# Avoid assigning GIDs below 1000
$highGid = [Math]::max( $highGid, 1000 )

# Find every security group without a gidNumber, and give it one.
Get-ADGroup -LDAPFilter "(!gidNumber=*)" |
    ? {$_.GroupCategory -eq "Security"} |
    $groups | Set-ADGroup -Add @{ gidNumber=++$highGid }

Isso pode ser facilmente adotado para trabalhar com usuários e uidNumbers também.

Se você quiser que a atribuição de uids / gids seja instantânea, a Microsoft tem uma interessante nota técnica sobre ouvindo para alterar as notificações do Active Directory via LDAP . Eu acho que é um pouco sofisticado demais para o PowerShell.

    
por 13.04.2013 / 21:52