Acontece que os armazenamentos de certificados são principalmente baseados em registro (os PKs são armazenados em disco, mas nenhum acesso especial é necessário para que possa ser ignorado) e fazem uso de ACLs de registro para acesso.
Os certificados de máquina local são todos armazenados em HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\
Também descobri que não é possível conceder acesso "Gravar, mas não excluir", pois mesmo as APIs nativas usadas por X509Store.Open(ReadWrite)
falharão se não estiverem definidas.
Abaixo está um script que pode ser usado para conceder acesso a certificados de importação para o armazenamento "Web Hosting":
$username = "SomeNonAdminUser"
$acl = Get-Acl HKLM:\SOFTWARE\Microsoft\SystemCertificates\WebHosting
$rule = $acl.Access | ?{ $_.IdentityReference -like "*\$username" }
if ($rule)
{
$rule | %{ $acl.RemoveAccessRule($_) | Out-Null }
}
$rule = New-Object System.Security.AccessControl.RegistryAccessRule '
$username, '
[System.Security.AccessControl.RegistryRights]"CreateSubKey, ReadKey, SetValue, Delete", '
[System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit", '
[System.Security.AccessControl.PropagationFlags]"None", '
"Allow"
$acl.AddAccessRule($rule)
$acl | Set-Acl