# Definicja kodu źródłowego C#: Skrypt zawiera definicję klasy SmartcardCredManager w języku C#, która zarządza poświadczeniami karty inteligentnej. [string] $SourceCode = @" using System; using System.Runtime.InteropServices; using System.Security; using System.Management.Automation; namespace Bongiovi.SmartcardLogon { public static class SmartcardCredManager { #region Enumeracje i stałe // Definicja enumeracji CRED_MARSHAL_TYPE określającej typ poświadczenia public enum CRED_MARSHAL_TYPE { CertCredential = 1, // Poświadczenie certyfikatu UsernameTargetCredential // Poświadczenie nazwy użytkownika } // Stała określająca długość skrótu certyfikatu public const int CERT_HASH_LENGTH = 20; #endregion #region Struktury i importy funkcji zewnętrznych // Definicja struktury CERT_CREDENTIAL_INFO przechowującej dane o certyfikacie [StructLayout(LayoutKind.Sequential)] internal struct CERT_CREDENTIAL_INFO { public uint cbSize; // Rozmiar struktury [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] rgbHashOfCert; // Skrót certyfikatu } // Import funkcji zewnętrznej CredUnmarshalCredential z advapi32.dll, która deserializuje poświadczenie [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern bool CredUnmarshalCredential( IntPtr MarshaledCredential, out CRED_MARSHAL_TYPE CredType, out IntPtr Credential ); // Import funkcji zewnętrznej CredFree z advapi32.dll, która zwalnia zaalokowaną pamięć dla poświadczenia [DllImport("advapi32.dll", SetLastError = true)] public static extern bool CredFree([In] IntPtr buffer); #endregion #region Metody // Metoda ReverseMarshal dokonuje odwrotnej deserializacji ciągu znaków na skrót certyfikatu public static string ReverseMarshal(string data) { IntPtr credData = IntPtr.Zero; // Uchwyt na dane poświadczenia IntPtr credInfo = IntPtr.Zero; // Uchwyt na informacje o poświadczeniu CRED_MARSHAL_TYPE credType = 0; // Typ poświadczenia try { // Przekształcenie ciągu znaków w obiekcie data na ciąg znaków Unicode i przypisanie go do credData credData = Marshal.StringToHGlobalUni(data); // Deserializacja poświadczenia bool success = CredUnmarshalCredential(credData, out credType, out credInfo); if (success) { // Konwersja struktury credInfo na CERT_CREDENTIAL_INFO CERT_CREDENTIAL_INFO certStruct = (CERT_CREDENTIAL_INFO)(Marshal.PtrToStructure(credInfo, typeof(CERT_CREDENTIAL_INFO))); // Pobranie skrótu certyfikatu i przekształcenie go na ciąg szesnastkowy byte[] data2 = certStruct.rgbHashOfCert; string hex = BitConverter.ToString(data2).Replace("-", string.Empty); return hex; // Zwrócenie ciągu szesnastkowego } } catch(Exception e) { // Obsługa wyjątku przez wyświetlenie komunikatu Console.WriteLine("An error occured: " + e.Message + e.StackTrace); } finally { // Zwolnienie zaalokowanej pamięci Marshal.FreeHGlobal(credData); Marshal.FreeHGlobal(credInfo); } return null; // Zwrócenie null w przypadku błędu } // Metoda IsCertificateCredential sprawdza, czy poświadczenie jest poświadczeniem certyfikatu public static bool IsCertificateCredential(string data) { IntPtr credData = IntPtr.Zero; // Uchwyt na dane poświadczenia IntPtr credInfo = IntPtr.Zero; // Uchwyt na informacje o poświadczeniu try { // Przekształcenie ciągu znaków w obiekcie data na ciąg znaków Unicode i przypisanie go do credData credData = Marshal.StringToHGlobalUni(data); credInfo = IntPtr.Zero; CRED_MARSHAL_TYPE credType = 0; // Deserializacja poświadczenia bool success = CredUnmarshalCredential(credData, out credType, out credInfo); if (!success) { int error = Marshal.GetLastWin32Error(); // Rozważ zapisanie komunikatu o błędzie do logu } // Zwrócenie informacji o tym, czy poświadczenie jest poświadczeniem certyfikatu return (success && credType == CRED_MARSHAL_TYPE.CertCredential); } catch(Exception) { // Rozważ zapisanie komunikatu o błędzie do logu return false; } finally { // Zwolnienie zaalokowanej pamięci CredFree(credInfo); Marshal.FreeHGlobal(credData); } } #endregion } } "@ # Dodanie typów: Importuje typy zdefiniowane w zestawach System, System.Runtime.InteropServices, System.Security i System.Management.Automation add-type -AssemblyName System; add-type -AssemblyName System.Runtime.InteropServices; add-type -AssemblyName System.Security; add-type -AssemblyName System.Management.Automation; # Kompilacja kodu źródłowego C# i dodanie go do bieżącej sesji PowerShell add-type -TypeDefinition $SourceCode -Language CSharp # Pobranie poświadczenia od użytkownika $smartcardCred = Get-Credential # Sprawdzenie, czy poświadczenie jest poświadczeniem certyfikatu $isCertCred = [Bongiovi.SmartcardLogon.SmartcardCredManager]::IsCertificateCredential($