Question Lister les shares d'un domaine

Plus d'informations
il y a 14 ans 6 mois #5311 par Chiqo
Bonjour,


je suis confronté à un problème, et ce malgré mes nombreuses recherches sur le net, et après lecture de plusieurs livres sur Powershell dont celui que l'on peut voir sur le coté ;)

Mon problème est le suivant : j'ai besoin de lister tous les fichiers accessibles au sein d'un (plusieurs) domaine(s) Active Directory pour un user.

En gros le but serait de lister (et au passage de récupérer les droits) de tous les fichiers de tous les serveurs que je peux voir dans \"My network place\".

Je me dit que si je le vois via une IG windows, je dois pouvoir récupérer ça par powershell. D'autant que depuis une station linux et un simple client fusesmb, je peux mounter en local ces fichiers.

Un [code:1]Get-WmiObject -class Win32_Share[/code:1] n'est pas l'idéal, étant donnée que WMI n'est pas configuré sur les serveurs pour un accès remote (plus de 200 serveurs + une liste d'une 30aine de workstations).

Si quelqu'un a une idée, je suis preneur et l'en remercie d'avance !

Chiqo, le boulet qui réussi à s'inscrire finalement :blush:

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 6 mois #5326 par Chiqo
Réponse de Chiqo sur le sujet Re:Lister les shares d'un domaine
Hmm, personne ? :(

Ce que je souhaite faire n'est pas claire ou alors Powershell ne le permet pas ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 6 mois #5327 par Laurent Dardenne
Salut,
Chiqo écrit:

Mon problème est le suivant : j'ai besoin de lister tous les fichiers accessibles au sein d'un (plusieurs) domaine(s) Active Directory pour un user.

Belle requête !
Chiqo écrit:

(et au passage de récupérer les droits)

un critére de plus :-)

Quelques recherche sur MSDN, je débutes avec clsid car le Shell est basé sur des interfaces COM :
My Network Places clsid -> IPersistFolder -> IShellFolder ->
Méthode IShellFolder::EnumObjects -> via ITEMIDLIST -> Introduction to the Shell Namespace
Et dans la dernière on voit un graphique référençant ton dossier que tu souhaites interroger, ça me semble une bonne piste.
Y a plus qu'à creuser les API, surtout que la méthode EnumObjects semble fournir les infos recherchées...

Cela fait un peu étalage, mais c'est pour te signaler que ce n'est pas parce que l'on VOIT les choses que l'on peut facilement les faire.
Chiqo écrit:

Ce que je souhaite faire n'est pas claire

L'énoncé est claire comme de l'eau de roche, ça réalisation va te demander un certains temps.
Chiqo écrit:

ou alors Powershell ne le permet pas ?

Il n'est pas prévu pour ce type de manipulations, déjà avec des langages évolués ce type de développement est loin d'être une sinécure.
Un des intérêts de PS est que les développeurs, systèmes ou pas, mettent à disposition des IT des outils facilitant l'administration.
Pour cette tâche personne n'a encore mis d'outil à ta dispo pour réaliser ce que tu souhaites.
Mais je reconnais que c'est un besoin comme un autre, ne connaissant pas AD, il se peut que tu puisses y trouver une solution, puisqu'il est un des fournisseur de cet affichage.

De plus ce que tu vois dans cette fenêtre est dynamique et elle permet une naviguation si je ne me trompes.
En théorie on peut donc imaginer un provider PS sur ce folder virtuel, une belle demande à formuler auprès de Microsoft ;-)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 6 mois #5330 par Chiqo
Réponse de Chiqo sur le sujet Re:Lister les shares d'un domaine
Bonjour Laurent,

je te remercie pour ton aide.

J'ai poursuivi les recherches avec tes pistes, mais je suis de nouveau bloqué, mais au niveau scripting désormais,j'ai failli créer un topic dans le forum débutant mais je préfère poster à la suite :)

J'en profite pour expliquer ce que je compte tester, dès fois que ça intéresse d'autres personnes.

Alors voilà, l'idée pour faire ce que je veux est d'utiliser les \"junction point\". Connaissant le CLSID de \"My Network Place\" (208D2C60-3AEA-1069-A2D7-08002B30309D ; trouvé sur MSDN), j'ai voulu utiliser la méthode [IFileSystemBindData2]::GetJunctionCLSID qui retourne

pclsid
[out] When this method returns successfully, receives a pointer to the CLSID of the object that implements IShellFolder for the current item, if the item is a junction point.


Cela semble donc convenir.

Mais le problème de débutant auquel je suis confronté est...comment accéder à cette méthode ? Elle ne semble pas être fournit par le framework .NET donc je suis un peu perdu :s

J'ai effectué quelques tests

[code:1]$test=New-Object -comObject IFileSystemBindData2[/code:1]

Dont des inutiles

[code:1]$test=[IFileSystemBindData2]::GetJunctionCLSID(\"208D2C60-3AEA-1069-A2D7-08002B30309D\"[/code:1]

Et encore d'autres que je n'afficherais pas pour garder un peu de crédibilité :p

Mais quelque chose à du m'échapper...

Je recherche donc quelqu'un pour m'éclairer sur cette partie :)

Merci d'avance.

Edit : après rélexion, instancier une interface me semble pas être une solution, je me trompe ? :x<br><br>Message édité par: Chiqo, à: 21/09/09 10:25

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 6 mois #5331 par Laurent Dardenne
Salut,
Chiqo écrit:

mais je préfère poster à la suite :)

Oui c'est préférable.
Chiqo écrit:

j'ai voulu utiliser la méthode [IFileSystemBindData2]::GetJunctionCLSID

A coeur vaillant rien d'impossible.
Chiqo écrit:

Elle ne semble pas être fournit par le framework .NET donc je suis un peu perdu

Normal c'est une API Win32, plus précisément une interface COM.
[code:1]$test=New-Object -comObject IFileSystemBindData2[/code:1]
Chiqo écrit:

Edit : après rélexion, instancier une interface me semble pas être une solution, je me trompe ?

Oui tu as raison.
Ici tu utilises une interface, c'est +- un contrat qu'un objet remplit.
Une interface est une abstraction, tu dois adresser un objet qui l'implémente.
Chiqo écrit:

Et encore d'autres que je n'afficherais pas pour garder un peu de crédibilité

:-)
Chiqo écrit:

Mais quelque chose à du m'échapper :(

Déjà PowerShell ne sait pas créer un objet COM à partir d'un CLSID (classe id), il faut passer par la classe Activator .
La doc de l'interface utilisée dans l'exemple, je pense que c'est celle-ci, si je regarde l'exemple et la signature de la méthode j'ai comme l'impression qu'il manque qq chose...

Ensuite tu récupères un pointeur en sortie uniquement, [ref] en PS. De plus tu dois gérer les erreurs renvoyées par cette méthode (HResult).
Tout en sachant que PS v1 gére trés mal la notion d'interface, celle du C#, bien qu'ici on soit plutot sous COM.
A tester.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 6 mois #5332 par Chiqo
Réponse de Chiqo sur le sujet Re:Lister les shares d'un domaine
Encore merci pour ton aide.
Laurent Dardenne écrit:

A tester


Disons que j'ai deux possibilités :

  • soit j'y arrive en continuant sur ma lancé
  • soit j'arrive a déployer via GPO une configuration qui me permetterait de faire des reqêtes WMI en remote pour que cette requête fonctionne \&quot;select * from Win32_Shares\&quot; (enfin je suppose que powershell effectue cette requête lors de l'appel à get-wmiobject -class win32_share -computerName blah\&quot; avant de mettre en forme et de nous retourenr les bons objets, vu les messages d'erreur que j'obtiens)

  • Je précise que ce script va être scheduler, et que par conséquent, les credentials utilisés doivent être ceux d'un user sans droits particulier (facile sinon avec les credentials admins :p)

    Le but de ce script est de mettre sous contrôle tous les shares du réseau, pour des raisons de sécurité.

    Durant mon stage je m'étais cassé les dents sur la deuxième solution (parc de 200 serveurs en production sous windows 2003 + les stations utilisateurs sous XP) et j'avais abandonné cette idée (je voulais passer par WMI pour du monitoring).

    Laurent Dardenne écrit:

    Déjà PowerShell ne sait pas créer un objet COM à partir d'un CLSID (classe id), il faut passer par la classe Activator.


    Pourrais-tu me donner un exemple pour mon cas si ce n'est pas abuser de te demander ça ; mes essais sont sans succès... Sans doute parce que je ne sais pas précisément comment charger l'assembly (mauvais namespace ?)

    [code:1][Activator]::CreateInstance([IFileSystemBindData2]::GetJunctionCLSID(\&quot;208D2C60-3AEA-1069-A2D7-08002B30309D\&quot;«»))[/code:1]

    Laurent Dardenne écrit:

    Ensuite tu récupères un pointeur en sortie uniquement, [ref] en PS.


    La gestion des pointeurs est compliqué sous powershell ? Peut-on récupérer l'objet qui est sous le pointeur (mon fameux IShellFolder !)

    Voilà, désolé de te demander autaut, mais je ne sais plus trop comment faire :/

    Connexion ou Créer un compte pour participer à la conversation.

    Temps de génération de la page : 0.085 secondes
    Propulsé par Kunena