OVH Cloud OVH Cloud

Chemin UNC et lancement d'une application tierce (DCOM)

17 réponses
Avatar
mc
Bonjour,

Voici ma situation:
J'ai un server exe ActiveX qui tourne sur (disons) PC1.
Mon client tourne sur un autre PC (disons PC2)
Quand j'appelle une fonction de mon exe ActiveX, le=20
programme soit:
1. contr=F4ler qu'un fichier donn=E9 existe
2. charger une application tierce (disons word), ouvrir=20
le fichier et l'imprimer.

Le chemin d'acc=E8s au fichier =E0 ouvrir est transmis par=20
l'application client. Le chemin est au format UNC (mais =E0=20
priori m=EAme avec un chemin mapp=E9, le probl=E8me est le=20
m=EAme).
Pour v=E9rifier si le fichier existe, j'utilise=20
FileSystemObject. Or FSO me dit que le fichier n'existe=20
pas, alors qu'il existe...

Maintenant si je transmets le chemin =E0 un fichier qui se=20
trouve sur PC1 (C:\Temp\blabla.doc, p.ex.) FSO me dit que=20
le fichier est bien l=E0. Par contre quand je veux d=E9marrer=20
Word (CreateObject("Word.Application")), =E7a ne marche pas=20
non plus...

Si je fais exactement la m=EAme chose avec mon client sur=20
le m=EAme PC que mon serveur, alors tout marche bien!

Qu'est-ce que je ne comprends pas???

7 réponses

1 2
Avatar
Patrick Philippot
Patrick Philippot wrote:
Il faut que le compte sous lequel tourne le process serveur sur PC1
ait les permissions d'accès sur les fichiers visés sur PC2. Comme
vous avez spécifié "launching user", essayez voir avec Interactive
User. Sinon, avec un autre compte dont vous êtes sûre qu'il a les
permissions requises.



Il me semble que c'est par là que ça se passe. Lisez SVP dans le MSDN,
l'article intitulé "COM Security Frequently Asked Questions", sections
"Q4 I get E_ACCESSDENIED from CoCreateInstanceEx. Why?" et surtout "Q10
What are the limitations of RunAs the Launching User?".

Vous tournez tout ça sous quel OS au fait?

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
mc
>Mais quand vous dîtes que c'est pareil avec un chemin


mappé, cela
veut-il dire que sur toutes les machines le mapping des


drives est
exactement identique? Et même, comment-cela est-il


possible si PC2
envoit à PC1 le nom d'un fichier local? C: ne peut pas


être mappé sur le
serveur.

Cela ne peut pas fonctionner, évidemment, à moins de


savoir quel drive
mappé utiliser pour que le serveur ait un chemin d'accès


valide ou de ne
passer que le nom de fichiers non locaux.



En fait mes affirmations viennent des tests que j'ai
effectués. Afin de trouver ce qui clochait,
j'ai "développé" une application client qui se contente
de passer le chemin & nom du fichier à traiter et
d'appeler la méthode de traitement. Dans mes tests j'ai
donc essayé plusieurs fichiers que je savais pouvoir
trouver depuis le PC "serveur". Cette application client
test, quant à elle, ne contrôle pas l'existance de ces
fichiers.

Je suis en train de réaliser qu'il y a un point que je
dois peut-être éclaircir, je ne sais pas du tout si ça
peut être important... Mon PC "serveur" n'est pas un
serveur de domaine ou quoi que ce soit du genre, c'est un
autre PC client de ce domaine mais qui me sert de serveur
pour cette application client. Ce PC n'est pas équipé
d'une version Server de Windows.
Ces 2 PC ont Windows XP SP1.
Avatar
Patrick Philippot
mc wrote:
Je suis en train de réaliser qu'il y a un point que je
dois peut-être éclaircir, je ne sais pas du tout si ça
peut être important... Mon PC "serveur" n'est pas un
serveur de domaine ou quoi que ce soit du genre, c'est un
autre PC client de ce domaine mais qui me sert de serveur
pour cette application client. Ce PC n'est pas équipé
d'une version Server de Windows.
Ces 2 PC ont Windows XP SP1.



Ce n'est pas important pour faire tourner un "serveur" COM. C'est
peut-être important pour les problèmes de permissions. Vous devriez
creuser le problème du compte sous lequel tourne le composant serveur,
ça me paraît être le plus important.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
>Ce n'est pas important pour faire tourner un "serveur"


COM. C'est
peut-être important pour les problèmes de permissions.


Vous devriez
creuser le problème du compte sous lequel tourne le


composant serveur,
ça me paraît être le plus important.



Oui, grâce à votre aide, j'ai décidé de concentrer les
recherches sur les droits d'accès. J'ai tout simplement
essayé en me loggant sur le "serveur" en tant qu'admin
réseau et en définissant que l'utilisateur qui crée le
process de mon applic est l'utilisateur interactif (soit
l'admin), et ça marche!
Il ne me reste plus qu'à trouver comment définir les
droits sur ce poste pour que l'utilisateur soit
l'appelant.
Avatar
ng
Parce que c'est fait pour le scripting et que c'est lent, de plus en early
binding on peut avoir de nombreux problèmes de compatibilités :
http://faq.vb.free.fr/index.php?question6

Sinon pour tester l'existance d'un fichier utilisez plutot une fonction
comme celle ci :

Private Function FileExists(ByRef strPath As String) As Boolean
On Error Resume Next
FileExists = ((GetAttr(strPath) And vbDirectory) = 0)
End Function

On gardera Dir$() pour lister les fichiers (et si on doit faire plusieurs
listes en mm temps ou si on utilise la recursivité on utilisera les APIs
FindFirstFile(), FindNextFile() et FindClose()).

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



mc a écrit :

Il est fortement déconseillé d'utiliser FSO en VBde toute facon,
utilisez plutot les fonctions implantées ou les APIs.




La fonction Dir() ne trouve pas mon fichier non plus.

Pour ma culture: pourquoi est-il déconseillé d'utiliser
FSO? Je l'utilise déjà depuis pas mal de temps et n'ai
jamais rencontré de problème (à part celui de ce thread,
mais à priori le problème n'a rien à voir avec FSO...)


Avatar
Patrick Philippot
wrote:
Il ne me reste plus qu'à trouver comment définir les
droits sur ce poste pour que l'utilisateur soit
l'appelant.



Pour éviter de vous compliquer la vie, dans DCOMCNFG, vous pouvez
utiliser "This user" au lieu de "Interactive User". Dans "This user",
vous spécifiez un compte que vous aurez créé rien que pour cet usage et
qui aura les droits appropriés et rien que ceux-là. De cette manière,
sauf contre-indication applicative, quel que soit l'utilisateur
appelant, vous utiliserez le même compte pour exécuter la requête.

Cette approche n'est bien sûr pas appropriée si le comportement du
serveur varie en fonction des droits de l'utilisateur appelant ou si le
service ne doit pas être accessible à certains utilisateurs.

Maintenant que le problème est identifié, je vous conselle de lire ce
document

http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q169/3/21.asp&NoWebContent=1

qui va vous aider à définir la meilleure stratégie en fonction de vos
besoins applicatifs, de la configuration de votre domaine, etc. Je ne
peux pas préconiser un choix plus qu'un autre sans connaître votre
environnement et vos besoins. Mais je pense que vous avez maintenant
tous les éléments (ou presque :-) ) en main.

Bon courage.

Une dernière remarque:
En DCOM, le plus pénible, vous l'avez remarqué, ce sont les réglages
sécurité. C'est pour cela qu'en matière de services distribués, la
tendance est désormais à l'utilisation de Web Services via le protocole
SOAP, même sur un Intranet. Avec la technologie .Net, c'est très facile
à mettre en oeuvre, côté client comme côté serveur. Si vous êtes coincée
avec VB6, il y a un toolkit qui permet d'interagir avec un Web Service:
le SOAP tookit
(http://www.microsoft.com/downloads/details.aspx?FamilyIDÉ43c0dd-ceec-4088-9753-86f052ec8450&displaylang=en),
un ensemble de composants COM clients qui vous facilite la tâche de
programmation du client d'un Web Service.

Si vos essais actuels sont du simple maquettage et si rien n'est fixé en
matière de design, je vous conseille fortement l'approche Web Service
plutôt que DCOM. Ceci étant, sur un Intranet, DCOM fonctionne bien une
fois que tout est réglé correctement. Mais si le service doit être un
jour distribué à l'extérieur (via Internet), ce n'est pas la bonne
approche.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
mc
>Pour éviter de vous compliquer la vie, dans DCOMCNFG,


vous pouvez
utiliser "This user" au lieu de "Interactive User".


Dans "This user",
vous spécifiez un compte que vous aurez créé rien que


pour cet usage et
qui aura les droits appropriés et rien que ceux-là. De


cette manière,
sauf contre-indication applicative, quel que soit


l'utilisateur
appelant, vous utiliserez le même compte pour exécuter


la requête.

Il semble que l'utilisateur qui appelle l'application
doit être l'utilisateur loggué (Interactive User), sinon
l'application AutoCAD que j'appelle ne fonctionne pas
(appel d'une application tierce marche donc ainsi)

Il faut aussi que cet utilisateur (celui loggué sur le
PC "serveur") ait les droits admin sur le PC serveur (le
pourquoi je sais pas trop, mais ça semble nécessaire....).

Ouf! Ca marche maintenant, je vous remercie vraiment
beaucoup, je ne sais pas si je m'en serais sortie toute
seule (surtout depuis le temps que je cherchais, je
commencais à manquer furieusement de recul...)

Maintenant que le problème est identifié, je vous


conselle de lire ce
document
http://support.microsoft.com/default.aspx?


scid=http://support.microsoft.com:80/support/kb/articles/q
169/3/21.asp&NoWebContent=1

Merci, je l'ai imprimé et vais cogiter ça tout à l'heure,
voire ce soir. Maintenant que je sais que le système
marche, il y a moins d'urgence pour "fignoler" la
question des droits. Je vais finir de débugguer l'applic
client d'abord!

Bon courage.


Merci! ;)

Une dernière remarque:
En DCOM, le plus pénible, vous l'avez remarqué, ce sont


les réglages
sécurité. C'est pour cela qu'en matière de services


distribués, la
tendance est désormais à l'utilisation de Web Services


via le protocole
SOAP, même sur un Intranet. Avec la technologie .Net,


c'est très facile
à mettre en oeuvre, côté client comme côté serveur. Si


vous êtes coincée
avec VB6, il y a un toolkit qui permet d'interagir avec


un Web Service:
le SOAP tookit
(http://www.microsoft.com/downloads/details.aspx?


FamilyIDÉ43c0dd-ceec-4088-9753-
86f052ec8450&displaylang=en),
un ensemble de composants COM clients qui vous facilite


la tâche de
programmation du client d'un Web Service.



Encore un sujet que je cogiterais, peut-être pas pour
cette fois, mais pour l'avenir.
L'application actuelle est un "one shot" que je ne pense
pas devoir distribuer ailleurs. Ce serveur est vraiment
très spécifique, alors je pense que la solutiona actuelle
convient. Mais comme déjà dit, si une situation semblable
se représente je regarderai pour la faire en soap...

Salutations,
Marina
1 2