public static IEnumerable <Container> EnumerateContainers(string providerName, ProviderType.Ids providerTypeId, Scope scope) { var acFlags = CryptAcquireContextFlags.CRYPT_VERIFYCONTEXT; if (scope == Scope.Machine) { acFlags |= CryptAcquireContextFlags.CRYPT_MACHINE_KEYSET; } var providerHandle = GetProviderHandle(null, providerName, providerTypeId, acFlags); var containerNameMaxLength_Bytes = 0; if (CryptEnumerateContainerNames(providerHandle, null, ref containerNameMaxLength_Bytes, EnumerationFlags.CRYPT_FIRST) == false) { throw new Win32Exception(); } var providerTypes = ProviderType.GetProviderTypes(); var containerName = new byte[containerNameMaxLength_Bytes]; var gppFlags = EnumerationFlags.CRYPT_FIRST; while (CryptEnumerateContainerNames(providerHandle, containerName, ref containerNameMaxLength_Bytes, gppFlags)) { yield return (new Container( Encoding.ASCII.GetString(containerName).TrimEnd('\0'), new Provider( GetProviderName(providerHandle), providerTypes[providerTypeId] ), scope )); Array.Clear(containerName, 0, containerName.Length); gppFlags = EnumerationFlags.CRYPT_NEXT; } providerHandle.Dispose(); }
public Provider(string name, ProviderType providerType) { Name = name; ProviderType = providerType; }