[DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern bool CryptEnumProviders(
[MarshalAs(UnmanagedType.U4)] int dwIndex,
[MarshalAs(UnmanagedType.U4)] ref int pdwReserved,
[MarshalAs(UnmanagedType.U4)] int dwFlags,
[MarshalAs(UnmanagedType.U4)] ref int pdwProvType,
StringBuilder pszProvName,
[MarshalAs(UnmanagedType.U4)] ref int pcbProvName);
Another kind of declaration:
[DllImport("advapi32.dll", EntryPoint = "CryptEnumProviders", SetLastError = true)]
static extern bool CryptEnumProviders(
uint dwIndex,
IntPtr pdwReserved,
uint dwFlags,
ref uint pdwProvType,
StringBuilder pszProvName,
ref uint pcbProvName);
None.
Do you know one? Please contribute it!
None.
Please add some!
[DllImport("Advapi32.dll")]
internal static extern bool CryptEnumProviders(
int dwIndex,
IntPtr pdwReserved,
int dwFlags,
ref int pdwProvType,
StringBuilder pszProvName,
ref int pcbProvName);
public static Dictionary<string, int> ReadAllProviders()
{
Dictionary<string, int> installedCSPs = new Dictionary<string, int>();
int cbName;
int dwType;
int dwIndex;
StringBuilder pszName;
dwIndex = 0;
dwType = 1;
cbName = 0;
while (CryptEnumProviders(dwIndex, IntPtr.Zero, 0, ref dwType, null, ref cbName))
{
pszName = new StringBuilder(cbName);
if (CryptEnumProviders(dwIndex++, IntPtr.Zero, 0, ref dwType, pszName, ref cbName))
{
installedCSPs.Add(pszName.ToString(),dwType);
}
}
return installedCSPs;
}
function Get-CryptoServiceProvider {
$TypeDefinition=@"
using System.Runtime.InteropServices;
using System.Security;
namespace PKI {
public static class CSP {
[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
public static extern bool CryptEnumProviders(
uint dwIndex,
uint pdwReserved,
uint dwFlags,
ref uint pdwProvType,
System.Text.StringBuilder pszProvName,
ref uint pcbProvName);
[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
public static extern bool CryptEnumProviderTypes(
uint dwIndex,
uint pdwReserved,
uint dwFlags,
ref uint pdwProvType,
System.Text.StringBuilder pszTypeName,
ref uint pcbTypeName);
}
}
"@
Add-Type -TypeDefinition $TypeDefinition -PassThru
$CSP=@()
$ProvTypes = @{}
#region default value definition for provider types
[UInt32]$dwIndex = 0
[UInt32]$pdwProvType = 0
$pszTypeName = New-Object Text.StringBuilder
[UInt32]$pcbTypeName = 0
#endregion
# retrieve provider type enumeration to a hashtable
while ([PKI.CSP]::CryptEnumProviderTypes($dwIndex,0,0,[ref]$pdwProvType,$null,[ref]$pcbTypeName)) {
$pszTypeName.Length = $pcbTypeName
if ([PKI.CSP]::CryptEnumProviderTypes($dwIndex++,0,0,[ref]$pdwProvType,$pszTypeName,[ref]$pcbTypeName)) {
$Type = $pszTypeName.TosTring()
$ProvTypes.Add($pdwProvType,$Type)
}
}
#region default value definition for providers
[UInt32]$dwIndex = 0
[UInt32]$pdwProvType = 0
$pszProvName = New-Object Text.Stringbuilder
[UInt32]$pcbProvName = 0
#endregion
# retrieve providers
while ([PKI.CSP]::CryptEnumProviders($dwIndex,0,0,[ref]$pdwProvType,$null,[ref]$pcbProvName)) {
$pszProvName.Length = $pcbProvName
if ([PKI.CSP]::CryptEnumProviders($dwIndex++,0,0,[ref]$pdwProvType,$pszProvName,[ref]$pcbProvName)) {
$objCSP=New-Object System.Object
$objCSP | Add-Member -NotePropertyName "Name" -NotePropertyValue $pszProvName.ToString()
$objCSP | Add-Member -NotePropertyName "TypeNum" -NotePropertyValue $pdwProvType
$objCSP | Add-Member -NotePropertyName "TypeName" -NotePropertyValue $ProvTypes[$pdwProvType]
$CSP+=$objCSP
}
}
$CSP | Format-Table -AutoSize
}