Назад | Перейти на главную страницу

Плагин или служебная программа AD, которая при создании генерирует уникальный uidnumber / gidnumber

Я ищу либо:

Плагин, который автоматически генерирует уникальное значение атрибута uidNumber для новых пользователей и уникальное значение атрибута gidNumber для новых групп при создании.

Настраиваемое приложение для управления пользователями / группами, которое может генерировать уникальные значения, указанные выше, а также заполнять различные другие атрибуты, необходимые для интеграции с Linux.

Мы представляем, что для всего этого мы используем самодельный скрипт и веб-страницу, но мы ищем что-то, что нам не нужно поддерживать и что-то более отполированное.

Кто-нибудь знает хороший инструмент, отвечающий всем требованиям?

Спасибо!

Я не знаю никаких существующих инструментов, которые действительно срабатывают при создании. Хотя, как упоминал Ник, гипотетически возможно написать что-то, что могло бы это сделать.

Но реально, как часто пользователи / группы создаются вне уже автоматизированных процессов? Если они еще не были, ваши существующие процессы подготовки должны быть расширены, чтобы добавить соответствующие RFC2307 атрибуты также описаны в это сообщение в блоге TechNet. Для отставших, созданных вручную, вы можете запустить сценарий с любым интервалом, который вам нравится, который ищет объекты, у которых отсутствуют атрибуты, и заполняет их по мере необходимости.

В нашей среде сценарий, который у нас есть, запускается каждые 5 минут на контроллере домена с ролью эмулятора PDC. Но мы, вероятно, могли бы уменьшить его до одной минуты без особого дополнительного воздействия. Мы также генерируем наши значения UID / GID на основе алгоритма, основанного на SID объекта, а не на простом автоинкрементном значении. Его преимущество состоит в том, что они гарантированно * уникальны для разных доменов / лесов, и нам не нужно выполнять какие-либо поиски, чтобы найти следующее значение или убедиться, что значение, которое мы хотим использовать, еще не используется. Я могу опубликовать эту функцию, если хотите. Но похоже, что у вас, ребята, уже может быть своя собственная система для этого.

* Гарантированно = насколько вы можете гарантировать, что два домена не будут созданы с одним и тем же случайно сгенерированным идентификатором домена.

Изменить: по запросу вот функция Powershell, которую мы используем для генерации UID / GID из 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.
#>

}

Вдохновленный ответами здесь и списком рассылки Samba, я написал инструмент под названием ADAM для назначения значений UID / GID:

https://gitlab.com/JonathonReinhart/adam

В настоящее время (июнь 2019 г.) это было протестировано только в Linux, работающем с доменом Samba Active Directory. Однако он должен работать (или быть очень близок) к Windows и / или к домену Windows Active Directory.

Вы можете назначить атрибут gidNumber из сценария PowerShell. Чтобы сделать это автоматически, вызовите сценарий как запланированное задание. Я написал командлет под названием Инициализировать-GroupGids который назначает уникальные идентификаторы группам AD и может быть настроен для различных сред с помощью параметров.

Но в основном вы можете просто сделать что-то подобное в 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 }

Это может быть легко адаптировано для работы с пользователями и uidNumbers.

Если вы хотите, чтобы присвоение uid / gids происходило мгновенно, у Microsoft есть интересный технический комментарий о прослушивание уведомлений об изменениях из Active Directory через LDAP. Я думаю, что это слишком сложно для PowerShell.