Diritti Utente ASPNET

giovedì 09 dicembre 2004 - 17.17

FrancescoGuadagno Profilo | Senior Member

Ciao, nel mio portale un particolare utente con diritti amministrativi può creare directory (tramite C#) sul webServer in cui poi il codice C# può scrivere delle info (oppure ad esempio effettuare upload dei file).

Ma come aggiungere nelle proprietà di Protezione l'utente ASPNET piuttosto che NETWORK Service con i relativi diritti di Lettura, modifica, pieno controllo?

LudovicoVan Profilo | Junior Member

Ciao,

NETWORK Service? Se il codice C# di cui parli viene eseguito da pagine web, allora l'utente corrente è (già) ASPNET, dunque i folder creati avranno automaticamente i permessi giusti. Occorre solo che nel folder che fa da *root* ci siano i permessi necessari per ASPNET.

Forse non ho capito qualcosa?

-LV

Brainkiller Profilo | Guru

Ciao LudovicoVan,
di solito si impostano manualmente questi diritti nel file system.
Se fai tasto destro proprietà sulle cartelle, linguetta protezione, puoi definire i vari permessi ai vari utenti.
Le cartelle create all'interno se non erro ereditano i permessi da quelle superiori.

ciao
david

FrancescoGuadagno Profilo | Senior Member

LudovicoVan, l'utente NetworkService si riferisce ad IIS 6 e come diceva BrainKiller non voglio impostarli manualmente.

Ho trovato una soluzione, molto utile e funzionale ma ahimè sembra molto lenta (penso sia normale), chi volesse può provare.

Active Directory Service Interfaces (ADSI) SDK 2.7 (Microsoft):

http://www.microsoft.com/ntserver/nts/download/other/ADSI25/default.asp per scaricare l'SDK.

Per un esempio (in vb):
http://support.microsoft.com/kb/818362/EN-US/


Questa invece la mia conversione in C# (la sto testando):

public static void SetPermissions(string vPath, string UserName)
{
ADsSecurity objADsSec;
SecurityDescriptor objSecDes;
AccessControlList objDAcl;
Object objAce;
AccessControlEntry objAce1;
AccessControlEntry objAce2;
ADsSID objSId;
Object objSIdHex;

objADsSec = new ADsSecurityClass();
objSecDes = Convert.ChangeType(objADsSec.GetSecurityDescriptor("FILE://" & vPath), SecurityDescriptor);
objDAcl = Convert.ChangeType(objSecDes.DiscretionaryAcl, AccessControlList);
objSId = new ADsSIDClass();
objSId.SetAs(ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SAM, UserName);
objSIdHex = objSId.GetAs();
// Add a new objAce so that the User has Full Control on NTFS Files.GetAs()
objAce1 = new AccessControlEntryClass();
objAce1.Trustee = (objSIdHex).ToString();
objAce1.AccessMask = ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_ALL;
objAce1.AceType = ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;
objAce1.AceFlags = ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ACE || ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ONLY_ACE || 1;
objDAcl.AddAce(objAce1);
// Add a new objAce so that the User has Full Control on NTFS Folders.

objAce2 = new AccessControlEntryClass();
objAce2.Trustee = (objSIdHex).ToString();
objAce2.AccessMask = ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_ALL;
objAce2.AceType = ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;
objAce2.AceFlags = ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ACE || 1;
objDAcl.AddAce(objAce2);
objSecDes.DiscretionaryAcl = objDAcl;
// Set Permissions on the NTFS folder.
objADsSec.SetSecurityDescriptor(objSecDes);
}

FrancescoGuadagno Profilo | Senior Member

scusate, ma ho scritto una versione "intermedia" del codice. La versione definitiva, testata e funzionante è la seguente:

public static void SetPermissions(string vPath, string UserName)
{
ADsSecurity objADsSec;
SecurityDescriptor objSecDes;
AccessControlList objDAcl;
Object objAce;
AccessControlEntry objAce1;
AccessControlEntry objAce2;
ADsSID objSId;
Object objSIdHex;

try
{
objADsSec = new ADsSecurityClass();
objSecDes = (SecurityDescriptor)(objADsSec.GetSecurityDescriptor("FILE://" + vPath));
objDAcl = (AccessControlList)(objSecDes.DiscretionaryAcl);
objSId = new ADsSIDClass();
objSId.SetAs(Convert.ToInt32(ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SAM), UserName);
objSIdHex = objSId.GetAs(Convert.ToInt32(ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SDDL));
// Add a new objAce so that the User has Full Control on NTFS Files.GetAs()
objAce1 = new AccessControlEntryClass();
objAce1.Trustee = (objSIdHex).ToString();
objAce1.AccessMask = Convert.ToInt32(ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_ALL);
objAce1.AceType = Convert.ToInt32(ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED);
objAce1.AceFlags = (0x2 | 0x8 | 0x1);
objDAcl.AddAce(objAce1);
// Add a new objAce so that the User has Full Control on NTFS Folders.

objAce2 = new AccessControlEntryClass();
objAce2.Trustee = (objSIdHex).ToString();
objAce2.AccessMask = Convert.ToInt32(ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_ALL);
objAce2.AceType = Convert.ToInt32(ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED);
objAce2.AceFlags = (0x2 | 0x1);
objDAcl.AddAce(objAce2);
objSecDes.DiscretionaryAcl = objDAcl;
// Set Permissions on the NTFS folder.
objADsSec.SetSecurityDescriptor(objSecDes,("FILE://" + vPath));
}
catch (Exception ex)
{
...
}
}


per richiamare la funzione:

Classe.SetPermissions("c:/prova","NOMEMACCHINA\ASPNET");

ciao

LudovicoVan Profilo | Junior Member

> di solito si impostano manualmente questi diritti nel file system.
> Se fai tasto destro proprietà sulle cartelle, linguetta protezione,
> puoi definire i vari permessi ai vari utenti.
> Le cartelle create all'interno se non erro ereditano i permessi da quelle superiori.

E io cosa ho detto?

Secondo me state cercando di risolvere un problema che non esiste... anyways, just my two cents.

-LV
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5