IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

de "shellExecute" à "Windows PowerShell"


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 14
    Par défaut de "shellExecute" à "Windows PowerShell"
    Bonjour à tous,

    Sous Delphi7, j'utilise beaucoup la commande shellExecute pour exécuter des batch.
    Dans un projet, je souhaite ajouter un lecteur réseau à la machine et au compte utilisateur qui utilise mon projet. Actuellement, je le fais à la main avec l'explorateur de fichier de Windows.

    Windows PowerShell permet de faire ceci, le problème, je ne sais pas lancer le script de PowerShell depuis Delphi.

    Avez-vous une solution pour ajouter mon lecteur réseau avec Delphi et/ou lancer un script de Windows PowerShell ?


    Voici le script générique de Windows Power Shell
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # VARIABLES
    $utilisateur = "domaine\utilisateur"
    $mdp ="LeMot2Passe"
    $UNC = "\\monserveur\partage\dossier"
    $lettre = "Z" # sans ":\"
    ############################################################
    # NE RIEN TOUCHER EN DESSOUS - début du script
    $SecureString = ConvertTo-SecureString $mdp -AsPlainText -Force
    $lettrePath = $lettre + ":\"
     
    $Credentials = New-Object System.Management.Automation.PSCredential $utilisateur, $SecureString
    New-PSDrive -name $lettre -PSProvider FileSystem -Root $UNC -Persist -Credential $Credentials
     
    if((Test-Path -Path $lettrePath )) {
    write "Connexion lecteur: OK" 
    } else { 
    write "ERREUR : connexion lecteur reseau impossible"
    }

    Vous devez simplement modifier les variables au début, nom de connexion format Windows 2000 ou classique utilisateur@maboite.tld.
    La lettre de lecteur sera "Z:\" pensez aussi à la modifier si vous utilisez déjà cette lettre.



    Merci de votre aide,

  2. #2
    Membre éprouvé Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Par défaut
    Bonjour,

    Il y a peut être des solutions plus propre, mais tu dois pouvoir faire un ShellExecute de Power Shell en lui passant ton script.

  3. #3
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 14
    Par défaut
    Citation Envoyé par oneDev Voir le message
    Bonjour,

    Il y a peut être des solutions plus propre, mais tu dois pouvoir faire un ShellExecute de Power Shell en lui passant ton script.
    Merci OneDev,

    J'ai essayé la methode bestiale et j’obtiens:
    'Get-ChildItem' n’est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.

  4. #4
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 14
    Par défaut
    Je creuse la piste suivante :
    ouvrir une fenêtre Dos
    lancer le script par la commande : powershell c:\monscript.ps1
    dans ce cas, je pourrais faire un ShellExecute de powershell c:\monscript.ps1

    Dès que j'ai pu testé et que celà fonctionne, je reviens poster ma solution.
    Si vous avez une solution plus propre, je suis preneur.

  5. #5
    Membre émérite Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 187
    Par défaut
    Citation Envoyé par GUNSHIP Voir le message
    Je creuse la piste suivante :
    ouvrir une fenêtre Dos
    lancer le script par la commande : powershell c:\monscript.ps1
    dans ce cas, je pourrais faire un ShellExecute de powershell c:\monscript.ps1

    Dès que j'ai pu testé et que celà fonctionne, je reviens poster ma solution.
    Si vous avez une solution plus propre, je suis preneur.
    Tu n'a pas besoin d'une fenêtre DOS, et Shellexecute permet de le faire, il suffit de connaitre la bonne commande Windows en l'occurance la commande est "net.exe"
    Exemple :

    Nom : ScreenShot_025.jpg
Affichages : 1560
Taille : 26,8 Ko

    Une petite fonction utile pour simplifier l'appel à ShellExecute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    function ShellProcess(Filename : string; Parameters : string ='' ) : Boolean;
    var
    	SEInfo		: TShellExecuteInfo;
        ExitCode	: DWORD;
        StartPath	: string;
    begin
        FillChar(SEInfo, SizeOf(SEInfo), 0) ;
        SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
        with SEInfo do
        begin
          	fMask := SEE_MASK_NOCLOSEPROCESS;
          	Wnd := Application.Handle;
          	lpFile := PChar(Filename);
    		if Parameters<>'' then
            begin
    			lpParameters := PChar(Parameters);
            end;
    		StartPath:=ExtractFilePath(Filename);
            if StartPath<>'' then
            begin
    	 		lpDirectory := PChar(StartPath);
            end;
          	nShow := SW_SHOWNORMAL;
        end;
    	Result:=False;
        if ShellExecuteEx(@SEInfo) then
        begin
        	repeat
            	GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
            	Sleep(100);
          	until (ExitCode <> STILL_ACTIVE);
            Result:=(ExitCode=0);
        end;
    end;
    Et l'appel pour connecter ton lecteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ShellProcess('net.exe','use M: \\SERV-JENNIE\Partage /persistent:yes') then ShowMessage('Succès !');
    Et pas besoin de .BAT !!!

    Tu peux aussi remplacer la constante SW_SHOWNORMAL par SW_HIDE et aucune fenêtre n'apparaitra à l'écran

    Pour toutes les options de net.exe, sous DOS tu tapes :

    Nom : ScreenShot_026.jpg
Affichages : 1638
Taille : 59,7 Ko

  6. #6
    Membre émérite Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 187
    Par défaut
    De plus l'API windows propose un ensemble de fonctions qui permettent de réaliser ces opérations sans avoir à passer par la commande "net.exe"

    C'est ici : https://docs.microsoft.com/fr-fr/win...ectedfrom=MSDN

  7. #7
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 14
    Par défaut

    Merci Sergio, j'avais quelque peu oublié les basiques du Dos et notamment le net use.
    Dans mon code, cela va simplifier les choses.
    En fait, avant sur chaque machine j'ajoutais à la main le lecteur Z:\, mais dans les évolutions envisagées de mon projet Delphi, je voulais faire ça en automatique (si le lecteur n'était pas ajouté).
    Il y a des paramètres de sécurité (mot de passe) qui seront dans mon .EXE ou alors "cacher" dans un fichier .cfg ou .ini

    Je clôture donc le sujet.
    MERCI

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/04/2010, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo