public String[] EnumKeys(Boolean machineKeyFlag = false) { UInt32 dwFlags = NCRYPT_SILENT_FLAG; if (machineKeyFlag) { dwFlags |= NCRYPT_MACHINE_KEY_FLAG; } List <String> keyNames = new List <String>(); IntPtr enumState = IntPtr.Zero; while (true) { IntPtr keyDataPtr = IntPtr.Zero; UInt32 hr = NCryptEnumKeys(hProvider, null, ref keyDataPtr, ref enumState, dwFlags); if (hr == NTE_NO_MORE_ITEMS) { break; } else if (hr != ERROR_SUCCESS) { throw new Win32Exception("NCryptEnumKeys failed."); } NCryptKeyName keyData = (NCryptKeyName)Marshal.PtrToStructure(keyDataPtr, typeof(NCryptKeyName)); keyNames.Add(keyData.pszName); if (NCryptFreeBuffer(keyDataPtr) != ERROR_SUCCESS) { throw new Win32Exception("NCryptFreeBuffer failed."); } } return(keyNames.ToArray()); }
/// <summary> /// Opens a key that exists in the specified CNG key storage provider. /// </summary> /// <param name="provider">The handle of the key storage provider to open the key from.</param> /// <param name="keyName">The description of the key to open.</param> /// <returns> /// A pointer to a NCRYPT_KEY_HANDLE variable that receives the key handle. When you have finished using this handle, release it by calling its <see cref="SafeHandle.Dispose()"/> method. /// </returns> public static SafeKeyHandle NCryptOpenKey(SafeProviderHandle provider, NCryptKeyName keyName) { return(NCryptOpenKey(provider, keyName.Name, keyName.dwLegacyKeySpec, (NCryptOpenKeyFlags)keyName.dwFlags)); }
public static extern unsafe SECURITY_STATUS NCryptEnumKeys( SafeProviderHandle hProvider, string pszScope, out NCryptKeyName* ppKeyName, ref void* ppEnumState, NCryptEnumKeysFlags dwFlags = NCryptEnumKeysFlags.None);