Reserver répertoire pour mon appli

Résolu
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 26 oct. 2011 à 13:03
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016 - 28 oct. 2011 à 20:05
Bonjour à tous,

je cherche comment je peux réserver la lecture/suppression de fichiers dans un répertoire réseau réservé à mon application tournant sur plusieurs machines.
L' idée est d' y mettre des images par exemple qui ne seront par la suite qu' accessible via mon application.
Je veux dire que l' utilisateur ne pourra pas supprimer ces fichiers via l' explorateur Windows.

Merci pour tout idée apportée.

A+


Composants Cindy pour Delphi
Faites une donation.

33 réponses

fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
28 oct. 2011 à 16:55
Bonjour

une autre solution mais sans codage
1- ajouter l'attribut système au répertoire
attrib +s Y:\Utilizadores\Administrator

2- créer un fichier desktop.ini dans Y:\Utilizadores\Administrator et y coller ceci
[.ShellClassInfo]
CLSID={20D04FE0-3AEA-1069-A2D8-08002B30309D}

enregistrer le fichier
Et là lors de la tentative d'entrer dans le répertoire Administrator via l'explorateur on est redirigé dans le poste de travail
Par contre via le code delphi pas de souci

L'inconvénient c'est pour intervenir sur le dossier après il faut y aller en dos
A+
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 oct. 2011 à 15:39
Bonsoir Mauricio,

juste un truc qui me vient à l'idée :

Si Dupont est autorisé sur un domaine à intervenir sur des fichiers
d'un dossier en réseau à travers ton application, pourquoi devrait-il perdre ses droits à travers windows ?

A moins bien sûr, qu'il existe une raison statistique auquel cas
je n'ai rien dit

cantador
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
26 oct. 2011 à 15:44
En fait, je veux donner des droits sur un répertoire à mon appli, pas à l' utilisateur.

J' ai trouvé ça mais je n' arrive pas à copier le fichier alors que Administrator à le droit d' accès au répertoire :
Site: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_23710185.html


Disons que j' ai un répertoire réseau "Y:\Utilizadores\Administrator".

if LogonUser('IBIT\Administrator', '', 'password', LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, h) then
try
if ImpersonateLoggedOnUser(h) then
begin
GetUserName(nil, d); // get logged in username, just for test
setlength(s, d+1);
GetUserName(pchar(s), d);
Caption := s;

if copyfile('Y:\Utilizadores\Administrator\logo.jpg', 'd:\logo.jpg', false)
then Caption := 'Copiado'
else Caption := 'Erro ao copiar';
end
else
showmessage(syserrormessage(getlasterror));
finally
closehandle(h);
end else
showmessage(syserrormessage(getlasterror));



Composants Cindy pour Delphi
Faites une donation.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
26 oct. 2011 à 16:03
Salut Mauricio,

Et en jouant sur les attributs de fichier... par exemple si ton fichier est en "lecture seule" et "caché", tu crois qu'un utilisateur pourrait quand même le supprimer ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
26 oct. 2011 à 16:31
Salut Cari,

Le problème est que l' appli doit pouvoir supprimer des fichiers!

Il semble que le bout de code plus haut soit la solution:
J' ai crée l' utilisateur administrator qui a tous les droits sur le répertoire réseau en question.
Par contre, je démarre ma session Windows comme l' utilisateur "mauricio".
Ensuite, j' essaye de faire LogonUser('administrator', dans mon appli: tout va bien jusqu' ici.
Par contre, je n' ai pas accès au fichier.
D' après ce que j' ai pu lire, il existe une fonction CreateProcessAsUserW à appeler après la fonction LogonUser pour executer une appli avec les droits de l' utilisateur de la fonction LogonUser. C' est exactement cela que je voudrai: donner des droits diefférents à une appli.
Reste à savoir si je vais y arriver ...


if LogonUser('administrator', '', 'password', LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_WINNT50, h) then
try
CreateProcessAsUserW(h, ...


A+



Composants Cindy pour Delphi
Faites une donation.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 oct. 2011 à 17:24
il faudrait que les fichiers soient cachés
à travers windows et visibles en se servant de l'appli...

à l'ouverture, on les rend visibles et à la fermeture on les cache

voyons voir....hummhhhh

aie, il y a un os car rien n'empêchera un utilisateur lambda d'ouvrir le dossier lorsque l'appli tournera..

autre solution, donner des droits à seule personne
et dès qu'un utilisateur se connecte faire comme si c'était l'élu (transfert)
et bien entendu, en dehors de cette entrée, pas moyen d'avoir les droits sur les fichiers puisque cette connexion est secrète se fait via le code.

non ?

cantador
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
26 oct. 2011 à 17:32
Salut Cantador,

je t' invite à jeter un oeil sur l' aide à propos de LogonUser et CreateProcessAUser.

Voilà ce que j' ai pour l' instant, ça marche pas:

var
htoken, hNewtoken: cardinal;
s: string;
d: cardinal;

Programa: String;
pi: TProcessInformation;
si: TStartupInfo;
begin
if not LogonUser('administrator', '', 'password', LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_WINNT50, htoken) then
begin
ShowMessage('LogonUser failed!');
Exit;
end;

Programa := 'calc.exe';
if CreateProcessAsUser(hToken, PChar(Programa), Nil, Nil, Nil, false, NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE, Nil, '', si, pi)
then Caption := 'Ok.'
else Caption := 'Failed';


Il existe dans la Jedi JCL (JEDI\jcl\examples\windows\asuser) un programme démo dans le même genre mais sans succès.


A+

Composants Cindy pour Delphi
Faites une donation.
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
26 oct. 2011 à 17:34
Je précise que le LogonUser fonctionne,
l' idée est d' executer l' appli avec des droits d' un autre utilisateur que celui qui est connecté.

A+


Composants Cindy pour Delphi
Faites une donation.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 oct. 2011 à 09:35
por isso trabalha com "CreateProcessWithLogonW"

cantador
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
27 oct. 2011 à 10:18
Salut,

merci Cari pour la source de fbalien qui semble après quelques tests être la solution.
@Cantador: CreateProcessWithLogonW n' existe pas pour tous les Windows.

A+


Composants Cindy pour Delphi
Faites une donation.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 oct. 2011 à 10:33
la source de fbalien utilise CreateProcessWithLogonW..
peut-être suffit-il de tester la version de windows ?
avec vista, ça coince apparemment..

cantador
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
27 oct. 2011 à 11:11
Je viens de comrendre. Il déclare la fonction lui même :

function CreateProcessWithLogonW(
lpUsername : PWideChar;
lpDomain : PWideChar;
lpPassword : PWideChar;
dwLogonFlags : DWORD;
lpApplicationName : PWideChar;
lpCommandLine : PWideChar;
dwCreationFlags : DWORD;
lpEnvironment : Pointer;
lpCurrentDirectory : PWideChar;
Const lpStartupInfo : TStartupInfo;
Var lpProcessInfo : TProcessInformation):Bool;stdcall;external 'advapi32.dll';

Par contre, j' ai encore un souci. Pour accéder aux fichiers, je dois donner le chemin comme cela: \\serveur1\prive\etc ...
alors que j' ai un lecteur virtuel déclaré ainsi: y:\
Si j' utilise le chemin "y:\etc ...", il me dit que le fichier n' existe pas alors que l' autre utilisateur a lui aussi le lecteur virtuel défini.

Il y a peut être un moyen de résoudre cela ...

A+


Composants Cindy pour Delphi
Faites une donation.
0
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
27 oct. 2011 à 18:11
Bonjour Mauricio

Es tu bien sur que le lecteur Y soit bien mappé sous le compte administrator
et que l'option "Se reconnecter à l'ouverture de session" soit active

Cordialement
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
27 oct. 2011 à 18:17
Salut fbalien,

oui.
J' utilise une fonction qui s' appelle WNetAddConnection3 et j' arrive à créer le lecteur manquant.
Par contre, je n' aime pas du tout cette fonction mais tout semble marcher ...

Merci à tous.


Composants Cindy pour Delphi
Faites une donation.
0
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
27 oct. 2011 à 18:22
Si non voici un bout de code qui me permet de changer d'utilisateur pendant l'execution du programme

function PerformLogonI(User, Domain, Password: String): Cardinal; stdcall;
var
  i : integer;

begin
  i := pos( '\',user);
  if i>0 then
  begin
    domain := copy(user,0,i-1);
    user := copy(user,i+1,length(user)-i);
  end;
  if NOT LogonUser(pChar(User), pChar(Domain), pChar(Password),
                   LOGON32_LOGON_INTERACTIVE,// or LOGON32_LOGON_NETWORK,
                   LOGON32_PROVIDER_DEFAULT,
                   Result) then RaiseLastWin32Error;
end;

    htoken := PerformLogoni(edtcnxlogon.Text,'',edtcnxPassword.Text );
    try
      if not ImpersonateLoggedOnUser(hToken) then ShowMessage(SysErrorMessage( getlasterror));
      try
        // action a faire en tant que autre user;
      finally
        RevertToSelf;
      end;
    finally
      CloseHandle(hToken);
    end;
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
27 oct. 2011 à 18:44
Le problème c' est que pendant l' exécution de l' appli, l' utilisateur aussi (et donc, pas seulement l' appli) a ces droits modifiés !?

A+


Composants Cindy pour Delphi
Faites une donation.
0
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
27 oct. 2011 à 19:48
en utilisant WNetAddConnection3 et en spécifiant un user et un mot de passe cela donne accès au lecteur effectivement au user
par contre si tu fait
un ImpersonateLoggedOnUser
puis un WNetAddConnection3 sans user et mot de passe (donc là connexion en tant que)
puis tu manipule le fichier sur le Y
et de suite après un RevertToSelf
le user n'a pas le temps de voir quoi que ce soit
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 oct. 2011 à 10:12
Peut être, mais l' appli est utilisée par l' utilisateur lui-même et ça implique qu' elle peut rester ouverte plusieurs heures ...


Composants Cindy pour Delphi
Faites une donation.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
28 oct. 2011 à 13:48
Je pense que ce que fbalien veut dire, c'est de ne changer les droits de l'utilisateur que strictement pendant les opérations d'écriture/lecture/suppression.
Hors de ces opérations, l'utilisateur n'aura que des droits restreints.

Mais si tu veux dire que pendant que ton appli est ouverte, n'importe qui peut faire n'importe quoi avec ton appli, le problème est différent...

D'ailleurs, je me demande comment tu vas gérer les accès concurrentiels aux données. Sauf erreur de ma part, tu ne peux pas utiliser de mutex dans ce cas...
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 oct. 2011 à 14:47
"Je pense que ce que fbalien veut dire, c'est de ne changer les droits de l'utilisateur que strictement pendant les opérations d'écriture/lecture/suppression"
- j' ai bien compris, mais l' accès necessaire est quasi permanent et donc, pas du tout occasionnel.

"Mais si tu veux dire que pendant que ton appli est ouverte, n'importe qui peut faire n'importe quoi avec ton appli"
- non, je veux dire par lá que seul l' appli doit avoir accès aux fichiers. Disons que l' appli pourra éliminer les fichiers mais pas l' utilisateur en y accédant via l' explorateur de fichiers.

Revenons, à ma question de départ avant d' avoir trouvé 1ère cette solution: il existe bien des programmes qui créent des fichiers sur un répertoire que ce dernier a crée: ces fichiers sont réservés au programme et lorsque l' on essaye d' accéder au répertoire via l' explorateur de Windows, l' accès nous est refusé. C' est ce comportement que je veux avec la particularité que le répertoire se trouve sur un lecteur résau!

A+





Composants Cindy pour Delphi
Faites une donation.
0
Rejoignez-nous