Edycja atrybutu pKIExpirationPeriod

Poprzednio pokazałem jak odczytać wartość atrybutu pKIExpirationPeriod dla szablonu certyfikatu usługi Active Directory Certificate Services. Mianowicie w jaki sposób przy pomocy PowerShella przekształcić typ danych Negative FileTime w bardziej przyswajalną dla człowieka formę. Natomiast dalej to nie rozwiązuje problemu modyfikacji wartości tego atrybutu. Dlatego by móc zapisać nową wartość okresu ważności certyfikatu musimy odwrócić cały proces.

Rozpoczynamy więc od przywrócenia odpowiedniej skali czasu czyli jednostki 100 nanosekund z jednoczesnym przeniesieniem do formatu ujemnego.

$Seconds = 63072000
$Seconds / (365*24*60*60) #czyli 2 lata
$NegativeNanoSeconds = $Seconds * (-10000000)

Następnie konwertujemy naszą ujemną wartość do system szesnastkowego otrzymując wartość FFFDC25D0E728000.

$HexNegativeNanoSeconds = "{0:X}" -f [Int64]$NegativeNanoSeconds
$HexNegativeNanoSeconds

Dzielimy ją na 8-bajtowy oktet (nadal w formacie szesnastkowym) i zapisujemy do tablicy.

$LittleEndianByteArray = $HexNegativeNanoSeconds -split '(.{2})' | ? {$_}

Ostatecznie przeprowadzamy ponownie proces odczytu tablicy w formacie Little-Endian i uzyskujemy żądaną wartość.

$ByteArray = New-Object System.Byte[] $LittleEndianByteArray.count
For ($($i = 0; $j = $LittleEndianByteArray.count - 1) ; $i -lt $LittleEndianByteArray.count ; $($i++; $j--))
{
	$ByteArray[$i] = [Convert]::ToInt64($LittleEndianByteArray[$j],16)
}

Cały zapis może się wydawać skomplikowany jednakże gdy całość zapiszemy jako funkcje, proces kodowania i dekodowania tej wartości okaże się o wiele prostszy.

Function ConvertFrom-pKIPeriod
{
	Param
	(
		[parameter(Mandatory=$true)]
		[Byte[]]$ByteArray
	)

	Process
	{
		$LittleEndianByte = ""
		For ($($i = 0; $j = $ByteArray.count - 1) ; $i -lt $ByteArray.count ; $($i++; $j--))
		{
			If($ByteArray[$j] -lt 16)
			{
				$LittleEndianByte += "0{0:X}" -f [Int]$ByteArray[$j]
			}
			Else
			{
				$LittleEndianByte += "{0:X}" -f [Int]$ByteArray[$j]
			}
		}
		$Period = ([Convert]::ToInt64($LittleEndianByte,16))*(-0.0000001)
		Return $Period
	}
}

Function ConvertTo-pKIPeriod
{
	Param
	(
		[parameter(Mandatory=$true)]
		[Int]$Seconds
	)

	Process
	{
		$NegativeNanoSeconds = $Seconds * (-10000000)
		$HexNegativeNanoSeconds = "{0:X}" -f [Int64]$NegativeNanoSeconds

		$LittleEndianByteArray = $HexNegativeNanoSeconds -split '(.{2})' | ? {$_}

		$ByteArray = New-Object System.Byte[] $LittleEndianByteArray.count
		For ($($i = 0; $j = $LittleEndianByteArray.count - 1) ; $i -lt $LittleEndianByteArray.count ; $($i++; $j--))
		{
			$ByteArray[$i] = [Convert]::ToInt64($LittleEndianByteArray[$j],16)
		}

		Return $ByteArray
	}
}

OK, przetestujmy więc zatem nadawanie nowej wartości. Najpierw odczytajmy stara wartość okresu ważności certyfikatu.

$ConfigContext = ([ADSI]"LDAP://RootDSE").ConfigurationNamingContext
$ADSI = [ADSI]"LDAP://CN=Certificate Templates,CN=Public Key Services,CN=Services,$ConfigContext"
$MyCert = $ADSI.psbase.children | Where-Object {$_.displayName -eq "My Code Signing"}

$ByteArray = $MyCert.pKIExpirationPeriod[0]
$Period = ConvertFrom-pKIPeriod -ByteArray $ByteArray
$Period

Obecna wartość atrybutu wynosi jeden rok w notacji sekundowej. Sprawmy zatem by okres ważności wynosił dwa lata.

[byte[]]$NewByteArray = ConvertTo-pKIPeriod -Seconds ($Period*2)
$NewByteArray

Czyścimy wartość atrybutu, nadajemy nową i całość zatwierdzamy metodą CommitChanges().

$MyCert.Properties["pKIExpirationPeriod"].Clear()
$MyCert.Properties["pKIExpirationPeriod"].Add($NewByteArray)
$MyCert.CommitChanges()

Dobrze rzekomo nadaliśmy nową wartość, więc sprawdźmy czy faktycznie wszytsko jest jak należy.

Jak widzimy zgodnie z oczekiwaniami okres ważności zmienił się z roku na dwa lata.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s