Microsoft Shell Controls And Automation

by Stéphane 16. July 2008 23:02

Un collègue m’a soumis un problème intéressant :

Comment récupérer, depuis une application .NET, les informations inscrites dans les propriétés d’un fichier (bouton droit de la souris, menu propriété). Je précise bien, les propriétés système de fichier d’un fichier, et non pas les propriétés applicatives du fichier (propriétés d’un document Word, Excel ou PDF).

Un rapide coup d’œil sur le namespace System.IO  montre que le Framework n’a rien pour gérer celaL. J’étends mes recherches et trouve rapidement que la clé se trouve dans l’objet COM Microsoft Shell Controls And Automation.  

Je développe la solution, la test et peux la libellé « Work on my machine ». Test suivant : un poste utilisateur.  Et là, malheur, problème d’interop sous .NET, la journée va être longue.

Après troubleshooting, le problème à été rapidement résolut :

Le poste de test ne reconnaissait pas  l’interface IShellDispatch5, alors que le poste de développement oui ??? Le Shell n’estt donc pas identique sous XP que sous Vista L, alors que la Shell32.dll fait la même taille.

L’application .Net faisant référence à un objet COM, un wrapper est automatiquement crée par VS : Interop.Shell32.dll. J’ai crée cet Interop sur un poste XP et l’ai mis dans le répertoir de l’application .Net et celle-ci fonctionne comme une fleur  autant sous XP que sous Vista !

Reste quelques questions sans réponses :

-          Pourquoi cette erreur apparaît, même lorsque je force l’interface (cast) à IShellDispatch4 ?

-          Lors de la création dynamique de l’objet COM (Activator.CreateInstance(…)), je ne peux pas invoquer les membres de l’objet (MethodInfo.invokMember(…))

Finalement, voici un exemple de code afin de récupérer la propriété Auteur :

IShellDispatch4 shellDispatch = (IShellDispatch4)new Shell32.ShellClass();
Folder folder = ((IShellDispatch4) shellDispatch).NameSpace(Path.GetDirectoryName(@"c:\\toto.txt"));
FolderItem folderItem = folder.ParseName(Path.GetFileName(@"c:\\toto.txt"));

// 0= le nom
// 1= La taille
// ...
// 9= l'auteur
// 11= objet


// 12= catégorie return folder.GetDetailsOf(folderItem, 9);

 

Tags:

C#

Extraire les utilisateurs d'un groupe dans Active Directory

by Stéphane 15. July 2008 22:22

Voici un exemple de code afin d'accèder aux membres d'un groupe dans l'AD ...

                String ADFullPath = LDAP://NomDeLAD;
                DirectoryEntry Ldap = new DirectoryEntry(ADFullPath);
                DirectorySearcher searcher = new DirectorySearcher(Ldap);

                searcher.Filter = "(&(objectClass=group)(cn=" + GroupName + "))";

                SearchResult results = searcher.FindOne();

                if (results != null)
                {

                    DirectoryEntry AdGroup = new DirectoryEntry(results.Path);
                    System.DirectoryServices.PropertyCollection pcoll = AdGroup.Properties;
                    int n = pcoll["member"].Count;

                    for (int l = 0; l < n; l++)
                    {

                        DirectoryEntry AdUser = new DirectoryEntry(ADFullPath + "/" + pcoll["member"][l].ToString());

                        TreeNode tn = new TreeNode(AdUser.Properties["name"].Value.ToString());
                        tvwMembres.Nodes.Add(tn);

                        TreeNode tn1 = new TreeNode(AdUser.Properties["description"].Value.ToString());
                        tn1.ImageIndex = 2;
                        tn1.SelectedImageIndex = tn1.ImageIndex;
                        tn1.ToolTipText = "description";
                        tn.Nodes.Add(tn1);

                        TreeNode tn2 = new TreeNode(AdUser.Properties["sAMAccountName"].Value.ToString());
                        tn2.ImageIndex = 1;
                        tn2.SelectedImageIndex = tn2.ImageIndex;
                        tn2.ToolTipText = "Account Name";
                        tn.Nodes.Add(tn2);

                        TreeNode tn3 = new TreeNode(AdUser.Properties["mail"].Value.ToString());
                        tn3.ImageIndex = 3;
                        tn3.SelectedImageIndex = tn3.ImageIndex;
                        tn3.ToolTipText = "Mail";
                        tn.Nodes.Add(tn3);

                        TreeNode tn4 = new TreeNode(AdUser.Properties["physicalDeliveryOfficeName"].Value.ToString());
                        tn4.ImageIndex = 4;
                        tn4.SelectedImageIndex = tn4.ImageIndex;
                        tn4.ToolTipText = "Office Name";
                        tn.Nodes.Add(tn4);

                        AdUser.Close();
                    }
                    Ldap.Close();
                    AdGroup.Close();

 

Tags: ,

C# | Active Directory

Un million d'iPhones vendu en un week-end.

by Stéphane 15. July 2008 05:10

Et pendant ce temps là, Nokia vends 360 millions de téléphones par année, soit un million par jour !

Beaucoup de bruit pour pas grand chose. Une pénuire volontaire de l'ami Steve et le tour est joué.

Tags:

iPhone

Vider le cache généré par click-onc

by Stéphane 9. July 2008 22:09

Voici une petite astuce pour forcer click-once à vider le cache local où est stockée l'application. Au prochain lancement, click-once déploiera à nouveau l'application.

Executez cette commande depuis une ligne de commande:
rundll32 dfshim CleanOnlineAppCache

Plus facile et plus rapide que de signer l'application à déploier avec un nouveau certificat.

 

Tags:

Click-once

IPMA Level C

by Stéphane 8. July 2008 22:36

Ce blog n'a plus été très actif depuis quelques temps ...

Mais j'ai une excuse : je prépare actuellement une certification de chef de projet. Cela me prends beaucoup d'energie mais le sujet est passionant.

Je vais quand même faire mon possible pour jouer avec le Framework.

@+

Tags:

Musing


Stéphane Schwartz, Chef de projet (IPMA Level-C) et développeur (MCSD.Net)

Linkedin Twitter

International Project Management Association

Microsoft Certified Technology Specialist Microsoft Certified Application Developer Microsoft Certified Solution Developer

AdSense

Month List

Powered by BlogEngine.NET 2.0.0.36 - Eco Theme by n3o Web Designers