Accedi per seguire   
Seguaci 0
sabrina.vallenari

[vb.net] Creare Cartella E Assegnarle Permessi

7 messaggi in questa discussione

Ciao, sto cercando un modo per creare, da un applicazione vbnet, una cartella e creare anche un utente di windows sul server e poi dare a quella cartella i permessi di lettura per quell'utente. Non posso andare ogni volta a farlo a mano sul server perchè sono tantissime.

Io sposto dei file pdf da una cartella dove sono messi tutti assieme e devo dividerli in varie cartelle.

:)

Ad esempio il mio file si chiama:

DDEFAC00002200055016_01_2008000022.PDF

io recupero il codice cliente dal nome del file, quindi in questo caso 000022, e devo creare una cartella chiamata 000022 e creare l'utente 000022 e dire a quella cartella che quell'utente può leggere il contenuto.

Ho trovato questo: System.Security.Permissions.FileIOPermission ...ma non ho capito come funziona e in internet non trovo niente! :leggi:

Help!

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Allora... sono riuscita a capire come fare a leggere e a settare i permessi per un file e per una cartella. :)

Ecco il codice:


Sub GetAclFile(ByVal path As String)
	'apro il file
	Dim fs As New FileStream(path, FileMode.Open, FileAccess.Read)
	'mi faccio restituire la lista di accessi
	Dim _fileSecurity As FileSecurity = fs.GetAccessControl()
	'per ogni regola che trovo
	For Each fsRule As FileSystemAccessRule In _fileSecurity.GetAccessRules(True, True, GetType(System.Security.Principal.NTAccount))
		'scrivo i risultati in una textbox
		TextBox1.AppendText("Utente:" & fsRule.IdentityReference.ToString & ",Accesso:" & fsRule.AccessControlType.ToString & ",Permessi:" & fsRule.FileSystemRights.ToString & vbCrLf)
	Next
	fs.Close()
End Sub

Sub SetACLFile(ByVal path As String, ByVal account As String)
	Try
		'apro il file
		Dim fs As New FileStream(path, FileMode.Open, FileAccess.ReadWrite)
		'recupero la lista di accessi
		Dim _fileSecurity As FileSecurity = fs.GetAccessControl()
		'creo una nuova regola dicendogli che l'utente può leggere ed eseguire
		Dim fsnewRule As New FileSystemAccessRule(account, FileSystemRights.ReadAndExecute, AccessControlType.Allow)
		'applico la regola al file
		_fileSecurity.AddAccessRule(fsnewRule)
		File.SetAccessControl(path, _fileSecurity)
		'per ogni regola che trovo
		For Each fsRule As FileSystemAccessRule In _fileSecurity.GetAccessRules(True, True, GetType(System.Security.Principal.NTAccount))
			'scrivo i risultati in una textbox
			TextBox1.AppendText("Utente:" & fsRule.IdentityReference.ToString & ",Accesso:" & fsRule.AccessControlType.ToString & ",Permessi:" & fsRule.FileSystemRights.ToString & vbCrLf)
		Next
		fs.Close()
	Catch ex As Exception
		TextBox1.AppendText(ex.ToString())
	End Try
End Sub

Sub GetACLDirectory(ByVal folder As String)
	Try
		'prendo la cartella
		Dim dir As New DirectoryInfo(folder)
		'mi faccio restituire la lista di accessi
		Dim _dirSecurity As DirectorySecurity = dir.GetAccessControl()
		'per ogni regola che trovo
		For Each fsRule As FileSystemAccessRule In _dirSecurity.GetAccessRules(True, True, GetType(System.Security.Principal.NTAccount))
			'scrivo i risultati in una textbox
			TextBox1.AppendText("Utente: " & fsRule.IdentityReference.ToString & ", Accesso: " & fsRule.AccessControlType.ToString & ", Permessi: " & fsRule.FileSystemRights.ToString & vbCrLf)
		Next
	Catch ex As Exception
		TextBox1.AppendText(ex.ToString())
	End Try
End Sub

Sub SetACLDirectory(ByVal folder As String, ByVal account As String)
	Try
		Dim dir As New DirectoryInfo(folder)
		Dim _dirSecurity As DirectorySecurity = dir.GetAccessControl()
		'gli dico che l'utente è abilitato a leggere quella cartella
		Dim fsnewRule As New FileSystemAccessRule(account, FileSystemRights.Read, AccessControlType.Allow)
		'aggiungo la mia regola
		_dirSecurity.AddAccessRule(fsnewRule)
		Directory.SetAccessControl(folder, _dirSecurity)
		'vado a leggere i permessi che ora ha la cartella, quindi ciclo per ogni regola che trovo
		For Each fsRule As FileSystemAccessRule In _dirSecurity.GetAccessRules(True, True, GetType(System.Security.Principal.NTAccount))
			'scrivo i risultati in una textbox
			TextBox1.AppendText("Utente: " & fsRule.IdentityReference.ToString & ", Accesso: " & fsRule.AccessControlType.ToString & ", Permessi: " & fsRule.FileSystemRights.ToString & vbCrLf)
		Next
	Catch ex As Exception
		TextBox1.AppendText(ex.ToString())
	End Try
End Sub

A questo punto devo capire come fare a creare un nuovo utente nell'active directory del mio server.

Ho trovato questo codice:


//active directory connection string
strConn = AUTHENTICATION_STRING + Environment.MachineName + "," + KEY_COMPUTER;
//active directory entry point for above connection string
objAD = new DirectoryEntry(strConn);
//where strConn is connection string for native (NT) protocol and objAD is Active Directory entry point.
//We will add new user using "Invoke" method which access special windows API functions:
objNewUser = objAD.Children.Add(USER_NAME, "user");
objNewUser.Invoke("SetPassword", new object[] {USER_PWD});
objNewUser.Invoke("Put", new object[] {"Description", USER_DESCR});
objNewUser.CommitChanges();
//After adding new user in Active Directory we can put this user in a properly group:
//finding group
objGrp = objAD.Children.Find(USER_GROUP, "group");
//adding new user to group
if (objGrp.Name != "")
{
objGrp.Invoke("Add", new object[] {objNewUser.Path.ToString()});
}
//endif

che, prima di tutto non è in vb, e poi non ho capito cosa devo mettere in strConn... <_<

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ciao, aggiornamento alla situazione.

Il codice che ho postato per la creazione di un utente non poteva funzionare perchè sul server dove stavo cercando di aggiungere l'utente non c'è l'active directory quindi non devo aggiungere l'utente all'active directory ma direttamente agli utenti di windows.

Vi posto il codice che funziona ma è su una pagina asp che io sto cercando di convertire in vb.net.

sub CreaUtente(ID,RagSociale,descrizione,psw,gruppo)
' strDominio ="DMZCIDIVERTE/192.168.0.17"
strDominio ="192.168.0.17"
strUser = ID
' CREO L'UTENTE
Set objDomain = GetObject("WinNT://" & strDominio)
Set objUser = objDomain.Create ("User", strUser)
If (err.number = 0) Then 'If not 0 then user ID already exists
 objUser.Description = descrizione
 objUser.FullName = RagSociale
' &H00040 'modifica password non consentita
' &H10000 'nessuna scadenza password
 objUser.put "Userflags", Flags OR &H10040 'setto le 2 proprietà booleane inerenti la password
 objUser.SetInfo
 objUser.SetPassword ( psw )
End If
Set objUser = nothing
'ASSEGNO AL GRUPPO
strGroup= gruppo
Set oDomain = GetObject("WinNT://192.168.0.17")
Set oGroup = oDomain.GetObject("Group", strGroup)
oGroup.Add ("WinNT://192.168.0.17/SERVER-05/" & strUser)
set oGroup = nothing
end sub

Io l'ho tradotto così:

Dim AD As DirectoryEntry = New DirectoryEntry("WinNT://SERVER-05") ' + strDominio)

Dim NewUser As DirectoryEntry = AD.Children.Add("provaSab", "user")

NewUser.Invoke("SetPassword", New Object() {"provaSab"})

NewUser.Invoke("Put", New Object() {"Description", "Test User"})

NewUser.CommitChanges()

Dim grp As DirectoryEntry

grp = AD.Children.Find("Guests", "group")

If grp.Name <> "" Then

grp.Invoke("Add", New Object() {NewUser.Path.ToString()})

End If

TextBox1.AppendText("Account Created Successfully")

Ma mi dice "Errore non specificato" alla riga del CommitChanges

Aiutatemi per favoreeee!! :sigh:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Inviato (modificato)

Ciao. Aggiornamento. :P

Sono riuscita almeno a creare l'utente. :)

Ma non riesco ad assegnare l'utente al gruppo users perchè mi dice Impossibile aggiungere o rimuovere un nuovo membro dal gruppo locale perché il membro non esiste. (Eccezione da HRESULT: 0x8007056B)

Questo il codice che utilizzo:

	Dim AD As DirectoryEntry = New DirectoryEntry("WinNT://192.168.0.17") ' + strDominio)
	Dim NewUser As DirectoryEntry = AD.Children.Add("provaSab", "user")
	NewUser.Invoke("SetPassword", New Object() {"provaSab"})
	NewUser.Invoke("Put", New Object() {"Description", "Test User"})
	NewUser.CommitChanges()
	Dim path = NewUser.Path
	Dim grp As DirectoryEntry
	grp = AD.Children.Find("Users", "group")
	If grp.Name <> "" Then
		grp.Invoke("Add", New Object() {NewUser.Path.ToString()})
	End If

Qualcuno mi aiuta per favore? :P :sigh: :P

Modificato da sabrina v

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ciao. Alla fine ci sono riuscita. Ma questa parte del forum è davvero un mortorio! Mi sono dovuta rispondere da sola!!

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
Ciao. Alla fine ci sono riuscita. Ma questa parte del forum è davvero un mortorio! Mi sono dovuta rispondere da sola!!

Ciao,

io ho il tuo stesso problema! Come l'hai risolto??

Grazie

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ciao Sabrina,

sono contento che tu sia riuscita a risolvere il problema autonomamente.

Purtroppo in questo periodo ho alcuni impegni di lavoro e personali che mi tengono lontani dal forum.

Ciao.

Jhon...

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Crea un account o accedi per lasciare un commento

Devi essere un utente registrato per partecipare

Crea un account

Iscriviti per un nuovo account nella nostra community. È facile!


Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.


Accedi Ora
Accedi per seguire   
Seguaci 0