Private/New-EnterpriseOID.ps1
<#
.SYNOPSIS Generates a new enterprise OID (Object Identifier) for use in Active Directory Certificate Services. .DESCRIPTION This function creates a new enterprise OID by generating a unique name and corresponding template OID. If a name is provided, it uses that as part of the OID. Otherwise, it generates a random name and OID parts. .PARAMETER Name Specifies the name to be used for the OID. The name should match the pattern '^\d+\.[0-9a-fA-F]{32}$'. .PARAMETER Server Specifies the Active Directory server to connect to for the query. .OUTPUTS System.Object Returns a custom object containing the generated Name and TemplateOID. .EXAMPLE PS C:\> New-EnterpriseOID -Name "12345678.0123456789abcdef0123456789abcdef" Generates a new enterprise OID using the specified name. .EXAMPLE PS C:\> New-EnterpriseOID Generates a new enterprise OID, connecting to the specified Active Directory server. #> function New-EnterpriseOID { [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] [CmdletBinding()] [OutputType([System.Object])] param( [Parameter(Mandatory = $false, Position = 0)] [ValidatePattern('^\d+\.[0-9a-fA-F]{32}$')] [System.String]$Name, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [System.String]$Server ) process { $common = @{} if ($PSBoundParameters.ContainsKey('Server')) { $common.Server = $server } $forestOID = Get-ForestEnterpriseOID @common <# OID CN/Name [10000000-99999999].[32 hex characters (MD5hash)] OID msPKI-Cert-Template-OID [Forest base OID].[10000000-99999999].[10000000-99999999] <--- second number same as first number in OID name #> if ($PSBoundParameters.ContainsKey('Name')) { $oidPart2 = ($Name -split '\.')[0] do { $oidPart1 = Get-Random -Minimum 10000000 -Maximum 99999999 $msPKICertTemplateOID = "$forestOID.$oidPart1.$oidPart2" } until (Test-IsUniqueOID @common -Name $Name -TemplateOID $msPKICertTemplateOID) } else { do { $oidPart1 = Get-Random -Minimum 10000000 -Maximum 99999999 $oidPart2 = Get-Random -Minimum 10000000 -Maximum 99999999 $oidPart3 = Get-RandomHex -Length 32 $msPKICertTemplateOID = "$forestOID.$oidPart1.$oidPart2" $Name = "$oidPart2.$oidPart3" } until (Test-IsUniqueOID @common -Name $Name -TemplateOID $msPKICertTemplateOID) } $oid = [PSCustomObject]@{ Name = $Name TemplateOID = $msPKICertTemplateOID } Write-Output -InputObject $oid } } |