$RequiresKeyArchival = "False"
}
# Конвертируем период действия сертификата в читаемый вид
$ValidityPeriod = Convert-pKIPeriod $template. properties.pKIExpirationPeriod.value
# Конвертируем период обновления сертификата в читаемый вид
$RenewalPeriod = Convert-pKIPeriod $template. properties.pKIOverlapPeriod.value
# Проверяем, содержит ли EKU значение Authenticate Client
if($template.properties.pKIExtendedKeyUsage -contains "1.3.6.1.5.5.7.3.2")
{
$AuthClient = "True"
}
Else
{
$AuthClient = "False"
}
# Проверяем наличие флага Enrollee Supplies Subject (ESC1)
if($Template.properties.'msPKI–Certificate-Name-Flag'. value -band "0x00000001")
{
$EnrolleeSuppliesSubject = "True"
}
else
{
$EnrolleeSuppliesSubject = "False"
}
# Проверяем наличие флага Any Purpose или пустое значение в EKU (ESC2)
if(($template.properties.pKIExtendedKeyUsage -contains "2.5.29.37.0") -or ($template.properties. pKIExtendedKeyUsage.Count -eq 0))
{
$AnyPurpose = "True"
}
Else
{
$AnyPurpose = "False"
}
# Проверяем наличие Request Agent в EKU (ESC3)
if($template.properties.pKIExtendedKeyUsage -contains "1.3.6.1.4.1.311.20.2.1")
{
$RequestAgent = "True"
}
Else
{
$RequestAgent = "False"
}
# Проверяем наличие флага msPKI-RA-Signature (ESC3)
if($template.properties.'msPKI-RA-Signature'.value -band "0x00000001")
{
$APSignature = "True"
}
else
{
$APSignature = "False"
}
# Проверяем наличие EnrollmentAgent в атрибутах Application Policies (ESC3)
if($template.properties.'msPKI-RA-Application-Policies' -contains "1.3.6.1.4.1.311.20.2.1")
{
$EnrollmentAgent = "True"
}
Else
{
$EnrollmentAgent = "False"
}
# Проверяем наличие флага NoSecurityExtension в атрибуте Enrollment Flag (ESC9 ESC10)
if($template.properties.'msPKI-Enrollment-Flag'.value -band "0x00080000")
{
$NoSecurityExtension = "True"
}
else
{
$NoSecurityExtension = "False"
}
# Проверяем наличие подтверждения на выпуск сертификата
if($template.properties.'msPKI-Enrollment-Flag'.value -band "0x00000002")
{
$PendAllRequests = "True"
}
else
{
$PendAllRequests = "False"
}
# Получаем время создания шаблона сертификата в формате epoch
$WhenCreated = (Get-Date $template.Properties. WhenCreated.DateTime -UFormat%s). split(',')[0]
# Получаем время изменения шаблона сертификата в формате epoch
$WhenChanged = (Get-Date $template.Properties. WhenChanged.DateTime -UFormat%s). split(',')[0]
# Создаем Cypher-запрос на создание узла шаблона сертификата
Add-Content $OutFile "MERGE (t: Template {name:'$Name', displayname:'$DisplayName', objectid:'$ObjectGUID', distinguishedname:'$DN', domain:'$DomainName', keysize:'$KeySize', exportablekey:$ExportableKey, requireskeyarchival:$RequiresKeyArchival, validityperiod:'$ValidityPeriod', renewalperiod:'$RenewalPeriod', authclient:$AuthClient, enrolleesuppliessubject:$EnrolleeSuppliesSubject, anypurpose:$AnyPurpose, requestagent:$RequestAgent, enrollmentagent:$EnrollmentAgent, apsignature:$APSignature, nosecurityextension:$NoSecurityExtension, pendallrequests:$PendAllRequests, whencreated:$WhenCreated, whenchanged:$WhenChanged});"
# Получаем SID владельца шаблона сертификата
$ID = new-object System.Security.Principal. NTAccount($template.ObjectSecurity.Owner)
$ownersid = $ID.Translate([System.Security.Principal. SecurityIdentifier]). toString()
if($ownersid.Length -le 12)
{
$ownersid = $DomainName +"-" + $ownersid
}
# Создаем Cypher-запрос на создание связи между шаблоном и владельцем
Add-Content $OutFile "MATCH (m {objectid:'$ownersid'}) MATCH (n: Template {objectid:'$ObjectGUID'}) MERGE (m)-[r: Owns]->(n) SET r.isacl=TRUE;"
# Получаем ACL для шаблона сертификата
$acls = $template.ObjectSecurity.Access
foreach($acl in $acls)
{
# Получаем SID объекта, который имеет права
$ID = new-object System.Security.Principal.NTAccount($acl.IdentityReference)
$ObjectSID = $ID.Translate([System.Security.Principal.SecurityIdentifier]). toString()
if($ObjectSID.Length -le 12)
{
$ObjectSID = $DomainName +"-" + $ObjectSID
}
# Проверяем права Enroll
if(($acl.ActiveDirectoryRights -match "ExtendedRight") -and ($acl.ObjectType -eq "0e10c968–78fb-11d2–90d4–00c04f79dc55"))
{
# Создаем Cypher-запрос на создание связи между шаблоном и объектами с правами Enroll
Add-Content $OutFile "MATCH (m {objectid:'$ObjectSID'}) MATCH (n {objectid:'$ObjectGUID'}) MERGE (m)-[r: CanEnroll]-(n) SET r.isacl=TRUE;"
}
# Проверяем права AutoEnroll
if(($acl.ActiveDirectoryRights -match "ExtendedRight") -and ($acl.ObjectType -eq "a05b8cc2–17bc-4802-a710-e7c15ab866a2"))
{
# Создаем Cypher-запрос на создание связи между шаблоном и объектами с правами Enroll
Add-Content $OutFile "MATCH (m {objectid:'$ObjectSID'}) MATCH (n {objectid:'$ObjectGUID'}) MERGE (m)-[r: CanAutoEnroll]-(n) SET r.isacl=TRUE;"
}
# Проверяем права WriteProperty
if(($acl.ActiveDirectoryRights -match "WriteProperty") -and ($acl.ActiveDirectoryRights -notmatch "ExtendedRight"))
{
if($acl.ObjectType -eq "00000000–0000–0000–0000–000000000000")
{
# Создаем Cypher-запрос на создание связи между шаблоном и объектами с правами GenericWrite
Add-Content $OutFile "MATCH (m {objectid:'$ObjectSID'}) MATCH (n {objectid:'$ObjectGUID'}) MERGE (m)-[r: GenericWrite]-(n) SET r.isacl=TRUE;"
}
else
{
# Создаем Cypher-запрос на создание связи между шаблоном и объектами с правами WriteProperty
Add-Content $OutFile "MATCH (m {objectid:'$ObjectSID'}) MATCH (n {objectid: