На самом деле вам не нужно настраиваемое разрешение для этого, но вам нужен настраиваемый атрибут, похожий на FileIOPermissionAttribute. В его методе CreatePermission вы можете создать FileIOPermission для фактического пути к папке, соответствующего значению SpecialFolder, переданному атрибуту. например (требуется дополнительная проверка):
[Serializable]
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]
public sealed class SpecialFolderIOPermissionAttribute : CodeAccessSecurityAttribute
{
private Environment.SpecialFolder _folder;
private FileIOPermissionAccess _access;
public SpecialFolderIOPermissionAttribute(SecurityAction action)
: base(action)
{
this.Unrestricted = true;
}
public Environment.SpecialFolder Folder
{
get
{
return this._folder;
}
set
{
this._folder = value;
this.Unrestricted = false;
}
}
public FileIOPermissionAccess Access
{
get
{
return this._access;
}
set
{
this._access = value;
this.Unrestricted = false;
}
}
public override IPermission CreatePermission()
{
FileIOPermission permission;
if (this.Unrestricted)
{
permission = new FileIOPermission(PermissionState.Unrestricted);
}
else
{
permission = new FileIOPermission(this.Access, Environment.GetFolderPath(this.Folder));
}
return permission;
}
}
Здесь следует обратить внимание на то, что Environment.GetFolderPath будет запрашивать доступ PathDiscovery к целевой папке, поэтому вам придется решить, хотите ли вы подтвердить это разрешение в своем методе CreatePermission. (Лично я подозреваю, что осложнения вокруг этого могут быть одной из причин того, что команда BCL вообще не реализовала поддержку специальных папок в FileIOPermissionAttribute.)