1 votes

Y a-t-il un moyen de se connecter automatiquement à Google Chrome de manière programmée?

J'ai besoin de connecter Google Chrome à un domaine d'apps Google sur un grand nombre d'ordinateurs. Chaque ordinateur a accès à son nom d'utilisateur et aussi à son mot de passe temporaire. Existe-t-il un moyen de se connecter automatiquement à Chrome? Il serait préférable de le faire sans installer de logiciel supplémentaire.

Jusqu'à présent, j'ai essayé de me connecter en utilisant le script Visual Basic SendKeys pour émuler des frappes de touches. Bien que cette méthode fonctionne, elle se casse fréquemment lors des mises à jour de Chrome, lorsque l'ordinateur est lent, ou lors de toute autre circonstance imprévue.

0 votes

Vous pourriez peut-être faire quelque chose avec les commutateurs de ligne de commande --login.... Voir Liste des commutateurs de ligne de commande de Chromium

0 votes

Il semble qu'ils aient supprimé la commande --login-password

1voto

Michael Points 68

Il s'agit davantage d'une mesure provisoire que d'une solution, je ne vais donc pas le marquer comme une solution.

Actuellement, je résous ce problème en faisant en sorte qu'un programme génère et exécute un fichier vbs pour saisir le nom d'utilisateur et le mot de passe de l'utilisateur. Ensuite, j'ai un autre programme qui vérifie le fichier de préférences de Chrome pour voir s'il a été configuré avec succès. Sinon, le script est relancé.

chromeConf.vbs (J'ai écrit un autre programme qui génère automatiquement ce fichier et l'exécute sur chaque ordinateur) :

Set oShell = CreateObject("WScript.Shell")
oShell.SendKeys "^{ESCAPE}" 'menu démarrer
WScript.Sleep 1000 'attente de chargement
oShell.SendKeys "chrome.exe" 'chrome
WScript.Sleep 1000
oShell.SendKeys "{ENTER}"
return = oShell.Run("waitForFocus.exe Chrome", 0, true) 'attente de l'ouverture de Chrome
oShell.SendKeys "%{F4}" 'go! be gone!
'Chrome doit être démarré deux fois pour assurer le même état de démarrage sur tous les ordinateurs
oShell.SendKeys "^{ESCAPE}" 'menu démarrer
WScript.Sleep 1000 'attente de chargement
oShell.SendKeys "chrome.exe" 'chrome
WScript.Sleep 1000
oShell.SendKeys "{ENTER}"
return = oShell.Run("waitForFocus.exe Chrome", 0, true)
oShell.SendKeys "chrome://settings" 'paramètres
oShell.SendKeys "{ENTER}"
WScript.Sleep 5000
oShell.SendKeys "{TAB}{TAB}" 'sélectionner connexion
oShell.SendKeys "{ENTER}"
WScript.Sleep 8000
oShell.SendKeys "{TAB}{TAB}" 'connexion
oShell.SendKeys "user@example.com"
oShell.SendKeys "{TAB}"
oShell.SendKeys "{ENTER}"
WScript.Sleep 4000
oShell.SendKeys "password"
oShell.SendKeys "{TAB}"
oShell.SendKeys "{ENTER}"
WScript.Sleep 4000
oShell.SendKeys "{TAB}" 'lien données
oShell.SendKeys "{TAB}"
oShell.SendKeys "{TAB}"
oShell.SendKeys "{TAB}"
oShell.SendKeys "{ENTER}"
WScript.Sleep 4000
oShell.SendKeys "{ESCAPE}" 'se débarrasser de la boîte de dialogue insistante
oShell.SendKeys "%{F4}" 'go! be gone!

waitForFocus.exe source :

// waitForFocus.cpp : Ce programme attend le chargement d'une fenêtre portant un nom spécifié
//

#include "stdafx.h"
#include 
#include 
#include 

using namespace std;

LPWSTR pszMem;

BOOL CALLBACK FindWindowBySubstr(HWND hwnd, LPARAM substring)
{
    const DWORD TITLE_SIZE = 1024;
    TCHAR windowTitle[TITLE_SIZE];

    if (GetWindowText(hwnd, windowTitle, TITLE_SIZE))
    {
        string fstr = CW2A(windowTitle); //convertir le titre de la fenêtre en chaîne de caractères
        if (fstr.find(LPCSTR(substring)) != string::npos && !(fstr.find("waitForFocus.exe") != string::npos)) { //est-ce ce que nous voulons
            cout << "Fenêtre trouvée !" << endl;
            _tprintf(TEXT("%s\n"), windowTitle);
            SwitchToThisWindow(hwnd, true); //true active l'émulation alt tab, qui empêche le bug de la fenêtre transparente
            return false;
        }
    }
    return true;
}

int main(int argc, char* argv[])
{
    if (argc > 2) {
        cout << "Ce programme prend 1 argument" << endl;
        cout << "L'argument devrait être une partie du nom de la fenêtre que vous souhaitez attendre" << endl;
    }
    else if (argc == 2) {
        if (string(argv[1]) == "/h" || string(argv[1]) == "-h" || string(argv[1]) == "/?" || string(argv[1]) == "-?"){
            cout << "Ce programme prend en entrée une partie du nom de la fenêtre et attend le chargement de cette fenêtre" << endl;
        }
        else {
            bool nfound = true;
            while (nfound) {
                HWND windowHandle = FindWindowA(0, argv[1]); //vérifier s'il existe une fenêtre correspondant exactement à ce que nous voulons
                if (windowHandle == NULL) {//non
                    HWND WINAPI GetForegroundWindow(void);//la fenêtre est-elle déjà ouverte (dans ce cas, je n'ai pas à la chercher)
                    pszMem = (LPWSTR)VirtualAlloc((LPVOID)NULL,
                        (DWORD)(80), MEM_COMMIT,
                        PAGE_READWRITE);
                    GetWindowText(GetForegroundWindow(), pszMem,
                        80);
                    cout << GetForegroundWindow() << ", ";
                    string resstr = CW2A(pszMem);
                    wcout << pszMem << endl;
                    if (resstr.find(string(argv[1])) != string::npos && !(resstr.find(string("waitForFocus.exe")) != string::npos)) {
                        cout << "trouvé !" << endl; //la fenêtre était déjà ouverte
                        nfound = false;
                    }
                    else { //elle ne l'était pas
                        if (!EnumWindows(FindWindowBySubstr, (LPARAM)argv[1])) { //parcourir chaque fenêtre
                            nfound = false;
                        }
                        else {
                            Sleep(1000);
                        }
                    }
                }
                else {
                    cout << "résultat absolu trouvé" << endl;
                    SwitchToThisWindow(windowHandle, true); //passer à la fenêtre située
                    nfound = false;
                }
            }

        }
    }
    else if (argc == 1) {
        cout << "Ce programme prend en entrée une partie du nom de la fenêtre et attend le chargement de cette fenêtre" << endl;
    }
    else {
        cout << "Comment avez-vous réussi à passer un nombre négatif d'indicateurs ?" << endl;
    }
    return 0;
}

validateGoogleChrome.exe source (Ce programme vérifie si Chrome a été configuré. Il suppose que le nom d'utilisateur de l'ordinateur est le même que celui du compte Google. Il doit également être exécuté dans %LOCALAPPDATA%\Google\Chrome\User Data\Default\Preferences) :

// validateGoogleChrome.cpp : Définit le point d'entrée de l'application console.
//

#include "stdafx.h"
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

string gUname() {
    char username[UNLEN + 1];
    DWORD size = UNLEN + 1;
    GetUserNameA(username, &size);
    stringstream conv;
    string uname = "";
    conv << username;
    conv >> uname;
    cout << "nom d'utilisateur : " << uname << endl;
    return uname;
}

int main()
{
    string line;
    string query =  gUname();
    ifstream file("Preferences");
    if (file.is_open()) {
        while (getline(file, line, '\n')) {
            if (line.find(query) != string::npos) {
                cout << "réussi" << endl;
                return 0;
            }
            else {
                cout << "échec" << endl;
                return 1;
            }
        }
    }
    else {
        cout << "ERREUR : fichier de préférences de Chrome introuvable" << endl;
        return 2;
    }
}

J'espère que ce code vous a horrifié au point de trouver une meilleure solution.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X