AD плагин или утилита, которая генерирует уникальный номер / идентификатор при создании
Я ищу либо:
Плагин, который автоматически создает уникальное значение атрибута uidNumber для новых пользователей и уникальное значение атрибута gidNumber для новых групп при создании.
Настраиваемое приложение для управления пользователями / группами, которое может генерировать указанные выше уникальные значения, а также заполнять различные другие атрибуты, необходимые для интеграции с Linux
Мы представляем, что используем домашний сценарий и веб-страницу, чтобы сделать все это, но мы ищем что-то, что нам не нужно поддерживать и немного доработать.
Кто-нибудь знает хороший инструмент, который отвечает всем требованиям?
Спасибо!
2 ответа
Я не знаю ни одного из существующих инструментов, которые на самом деле запускаются при создании. Хотя, как упоминал Ник, гипотетически возможно написать что-то, что могло бы сделать это.
Но на самом деле, как часто пользователи / группы создаются вне уже автоматизированных процессов? Если это еще не так, ваши существующие процессы обеспечения должны быть дополнены, чтобы добавить соответствующие атрибуты RFC2307, также описанные в этом сообщении в блоге TechNet. Для отставших, которые создаются вручную, вы можете запускать скрипт с любым интервалом, который вам нравится, который ищет объекты, не имеющие атрибутов, и заполняет их по мере необходимости.
В нашей среде скрипт, который мы запускаем, выполняется каждые 5 минут на контроллере домена с ролью эмулятора PDC. Но мы, вероятно, могли бы опустить его до одного раза в минуту без особого дополнительного воздействия. Мы также генерируем наши значения UID/GID из алгоритма, который основан на SID объекта, а не на простом автоматически увеличивающемся значении. Преимущество заключается в том, что они гарантированно * уникальны между доменами / лесами, и нам не нужно выполнять поиск, чтобы найти следующее значение или убедиться, что значение, которое мы хотим использовать, еще не используется. Я могу опубликовать эту функцию, если хотите. Но, похоже, у вас, ребята, уже есть собственная система для этого.
* Guaranteed = столько, сколько вы можете гарантировать, что два домена не будут созданы с одинаковым случайно сгенерированным идентификатором домена.
Изменить: По запросу, вот функция 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. Чтобы сделать это автоматически, вызовите сценарий как запланированное задание. Я написал командлет Initialize-GroupGids, который назначает уникальные gids группам 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.
Если вы хотите, чтобы назначение uids / gids происходило мгновенно, у Microsoft есть интересная информация о прослушивании уведомлений об изменениях из Active Directory через LDAP. Я думаю, что это слишком сложно для PowerShell.