FileSecurity.setOwner ERRORE - VB.NET (.NET Framework 4.5)

lunedì 30 giugno 2014 - 12.23
Tag Elenco Tags  VB.NET  |  .NET 4.0

darken Profilo | Newbie

Buongiorno a tutti,
come da oggetto stò facendo un programma in VB.net Framework 4.5 ed ho un problema nel settare l'Ownership di un file.
Inanzitutto ecco come tento di settarlo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Allora vediamo di spiegare al meglio il problema senza dilungarmi troppo nel motivo per cui devo farlo:

Devo settare l'ownership di un file su un utente NON presente nel sistema sul quale eseguo questa riga di codice.
Di questo utente ho sia il nome in formato stringa ("dominio\user") sia il suo SID. Il problema è che se tento di settarlo direttamente col nome in formato stringa non me lo prende (perchè sul sistema non è presente) e l'owner del file mi rimane l'utente che ha "copiato" il file.
Fin qui sono d'accordo perchè effetivamente cerca di risolvere il nome utente in un SID che non trova nel sistema in uso. Il problema è che a questo punto, dato che conosco il SID, vorrei settare direttamente quello ma non trovo il modo di farlo perchè ogni volta mi viene generata un eccezzione che mi dice che l'utente non esiste (E QUESTO LO SO PURE IO CHE NON ESISTE NEL SISTEMA IN USO MA QUEL SID LO VOGLIO SETTARE LO STESSO )!

Il risultato che vorrei ottenere è lo stesso che si ottiene se copio un file su una chiavetta (o disco esterno) formattato in NTFS e poi vado a vedere l'ownership (ed i permessi) su un altro PC. Il sistema non riconoscendo l'utente, mi mostra solo il suo SID.
Questo a me andrebbe benissimo perchè il mio problema è che il file NON DEVE perdere permessi ed owner inquanto comunque verrò SOLO utilizzato nel sistema originario inquanto la mia è una "copia" di backup.
C'è un modo per settare DIRETTAMENTE IL SID senza il comando "New SecurityIdentifier("dominio\utente").Translate(GetType(NTAccount)).ToString)" che naturalmete non mi risolve una mazza dato che quell'utente nel sistema non esiste?!

Ringrazio tutti anticipatamente per tutti gli eventuali suggerimenti....

0v3rCl0ck Profilo | Guru

ricordati che comunque per salvare il cambiamento devi chiamare il metodo:

File.SetAccessControl(filePath, fs);

dove fs è il FileSecurity ritornato da File.GetAccessControl, modificato con i vari metodi come appunto "SetOwner".

per il problema di settare un sid, devo ancora guardarci bene, ma in effetti dovrebbe essere fattibile.


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

0v3rCl0ck Profilo | Guru

cercando un po' mi sembra non sia possibile farlo senza avere un authority che ti confermi l'esistenza dell'utente, quindi quando setti deve essere collegato alla macchina o al dominio dove esiste l'utente, una volta settato, poi il disco può essere spostato anche su un altra macchina che non conosce quel sid, ed è per quello che ti fa vedere il sid nelle proprietà, ma ho paura che appunto non si possa settare senza avere l'autorizzazione dal proprietario della credenziale, quindi il computer locale dove è presente tale credenziale o il dominio, del resto scusa, a pensarci bene ha molto senso, altrimenti conoscendo semplicemente il tuo sid, potresti darti un permesso su un qualsiasi file scollegandolo prima dal dominio o dal computer, settare te come nuovo owner, e poi riattaccarlo in rete e come se niente fosse avresti i diritti su quel file, non particolarmente sicuro.


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

darken Profilo | Newbie

>ricordati che comunque per salvare il cambiamento devi chiamare
>il metodo:
>
>
>File.SetAccessControl(filePath, fs);
>
>
>dove fs è il FileSecurity ritornato da File.GetAccessControl,
>modificato con i vari metodi come appunto "SetOwner".
>
>per il problema di settare un sid, devo ancora guardarci bene,
>ma in effetti dovrebbe essere fattibile.
>
>
>Michael Denny | Visual C# MVP
>http://blogs.dotnethell.it/Regulator/
>http://dennymichael.wordpress.com
>http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
>Twitter: @dennymic

Grazie, ma avevo semplicemente omesso nel post quella parte di codice dandola per scontato.
Ma hai fatti bene a precisare, a scanso di equivoci

darken Profilo | Newbie

>cercando un po' mi sembra non sia possibile farlo senza avere
>un authority che ti confermi l'esistenza dell'utente, quindi
>quando setti deve essere collegato alla macchina o al dominio
>dove esiste l'utente, una volta settato, poi il disco può essere
>spostato anche su un altra macchina che non conosce quel sid,
>ed è per quello che ti fa vedere il sid nelle proprietà, ma ho
>paura che appunto non si possa settare senza avere l'autorizzazione
>dal proprietario della credenziale, quindi il computer locale
>dove è presente tale credenziale o il dominio, del resto scusa,
>a pensarci bene ha molto senso, altrimenti conoscendo semplicemente
>il tuo sid, potresti darti un permesso su un qualsiasi file scollegandolo
>prima dal dominio o dal computer, settare te come nuovo owner,
>e poi riattaccarlo in rete e come se niente fosse avresti i diritti
>su quel file, non particolarmente sicuro.
>
>
>Michael Denny | Visual C# MVP
>http://blogs.dotnethell.it/Regulator/
>http://dennymichael.wordpress.com
>http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
>Twitter: @dennymic

Ok, ma per bypassare ownership/permessi basta copiare il file semplicemente su un file system FAT32 e far decadere in un colpo solo permessi ed ownership!
Oppure semplicemente autenticarsi come amministratore della macchina locale per aver pieno accesso e modificare i permessi a piacimento. Il fatto che sia fatto apposta per sicurezza mi perplime un po' inquanto ci sarebbero una marea di modi diversi per "sproteggere" un file senza dover ricorrere al Vb.

Ma ad ogni modo, allora i sistemi di back-up come fanno a preservare ownership e permessi?
Vorrei evitare di dover zippare un file per volta solo per poter mantenere permessi ed ownership, ho bisogno di poter leggere ownership e permessi da un file in locale e settarli su un file in remoto (ed essendo in remoto naturalmente il set di utenti è diverso da quello locale)... ...il tutto in VB.net naturalmente....

darken Profilo | Newbie

Adesso ho provato facendo così:

'Su client leggo il valore così x = fsecurity2.GetSecurityDescriptorBinaryForm 'Mentre su server scrivo il valore letto su client così: fileAcl.SetSecurityDescriptorBinaryForm(x)

Naturalmente finche eseguo tutto sulla stessa macchina OK, i due file sono identici.
Ma se faccio il giochetto in questione e quindi uso uno server in cui tale utente non esiste:

"System.InvalidOperationException è stata individuata
HResult=-2146233079
Message=L'identificatore di sicurezza non può essere il proprietario di questo oggetto.
Source=mscorlib
StackTrace:
in System.Security.AccessControl.NativeObjectSecurity.Persist(String name, SafeHandle handle, AccessControlSections includeSections, Object exceptionContext)
in System.Security.AccessControl.NativeObjectSecurity.Persist(String name, AccessControlSections includeSections, Object exceptionContext)
in System.Security.AccessControl.NativeObjectSecurity.Persist(String name, AccessControlSections includeSections)
in System.Security.AccessControl.FileSystemSecurity.Persist(String fullPath)
in System.IO.File.SetAccessControl(String path, FileSecurity fileSecurity)
in System.IO.FileInfo.SetAccessControl(FileSecurity fileSecurity)
in ConsoleApplication1.SynchronousSocketListener.scrivi(String dati) in X:\Users\xxx\Desktop\xxx\ConsoleApplication1\ConsoleApplication1\Module1.vb:riga 174
InnerException:
"

0v3rCl0ck Profilo | Guru

stessa eccezione che prendo io se ci provo, per questo ho pensato che non fosse possibile per qualche ragione di security, ma del resto non ne sono certo, infatti guardando meglio la problematica, e facendomi un ripassino veloce su NTFS e file system in generale, un file non porta mai con se le permission o ACL, ma sono descritte/salvate in un database, quello del file system dove vengono storate anche le informazioni quali nome file e metadati in genere.

Di norma quando si copia un file all'interno della stessa partizione, i dati ACL vengono mantenuti perchè di fatto viene solo cambiato il file path, se si sposta in un altra partizione o computer, questi dati vengono persi, e vengono ereditati quelli presenti sulla cartella padre di destinazione.

Detto questo effettivamente esistono programmi che sono in grado di mantenere le permission durante la copia, vedi anche il semplice comando XCOPY con gli switch /K /O /X... quindi a questo punto sicuramente un modo c'è, ora c'è da vedere se è possibile con l'implementazione managed che da .net sulle api di sistema o bisogna utilizzare qualche istruzione unmanaged.

ci guardo ancora un po'...


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

0v3rCl0ck Profilo | Guru

forse il problema è solo con l'owner, hai provato a copiare le AccessRule con il comando AddAccessRule

http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.commonobjectsecurity.addaccessrule.aspx

forse potrebbe essere sufficiente per te mantenere l'ACL, forse il concetto di owner è qualcosa che va al di la dell'access control list...


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

0v3rCl0ck Profilo | Guru

non so... prova a vedere anche questi:

http://stackoverflow.com/a/17451669/1082342

http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.setaccesscontrol.aspx



Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

darken Profilo | Newbie

Ok, grazie.

Per le accessRule ho già provato ed il problema è lo stesso. Se l'accessRule fà riferimento ad un utente presente sul server, tutto OK... ...altrimenti stesso errore

Proverò a dare un occhio ai link che mi hai girato, speriamo ne salti fuori qualcosa di buono......

A dir il vero a me basterebbe copiare anche i file "nudi e crudi" senza permessi ne accessRule, a patto che poi riesco a copiare e ripristinare il database che gestisce tutto!
Difatti ho provato a dare un occhio in giro per un approccio di questo genere, ma per adesso non ho trovato nulla a riguardo....

....continuerò a cercare.....

0v3rCl0ck Profilo | Guru

trovato qualcosa nel frattempo?


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

darken Profilo | Newbie

No, ho provato a risolvere con questo stratagemma:

http://mymcsft.wordpress.com/2012/10/01/backup-permessi-ntfs/

ma non funziona lo stesso, mi dà esattamente lo stesso problema. Stò valutando di salvare i permessi su DB (o file) e ripristinarli in seguito sulla macchina client dopo aver ricopiato il file (quindi di far eseguire il tutto al client). Ma qualche problema lo ho comunque.

Adesso stò valutanto di usare sistemi alternativi tipo archiviare i file (com il TAR in linux) o abbandonare questo progetto e riscriverlo da zero in altro modo.
In questo momento sono abbastanza arenato e stò andando avanti su altri fronti....

0v3rCl0ck Profilo | Guru

per curiosità hai provato il comando XCOPY, per vedere se mantiene le permission:

Initial Full Copy

xcopy "C:\Source Folder" "\\Destination Server\Share\Folder" /X /H /E /V

Copy files or folders that have changed since the initial copy

xcopy "C:\Source Folder" "\\Destination Server\Share\Folder" /X /H /E /V /D /Y

Switch Explaination

/X - Copies file audit settings and file ownership and ACL information.
/H - Copies hidden and system files.
/E - Copies directories and subdirectories, including empty ones.
/V - Verifies each new file.
/D - Copies files changed on or after the specified date (D:m-d-y).If no date is given, copies only those files whose source time is newer than the destination time.
/Y - Suppresses prompting to confirm you want to overwrite an existing destination file.

Fonte: http://www.geekshangout.com/content/using-xcopy-copy-files-and-folders-and-keeping-ntfs-permissions

perchè se funzionasse così, potresti intanto pezzare la cosa, sfruttando proprio il comando xcopy, controllandolo da .net con la classe Process


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

darken Profilo | Newbie

Appena ho tempo faccio una prova e posto il risultato,

Grazie!!
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