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

Langage Java Discussion :

java 1.8 Changer le contexte utilisateur


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2011
    Messages : 5
    Par défaut java 1.8 Changer le contexte utilisateur
    Bonjour à tous,

    Je suis en train de faire une petit développement en java pour checker des services Windows à distance et je suis confronté à un problème qui dure depuis au moins 4 jours et je commence à perdre patience .

    L'application se lancera depuis un pc avec un compte qui n'a aucun droit. Le but est de demander un login/password pour exécuter le reste des actions d'administration. Pour ce faire, j'ai créé une page de login et un singleton pour récupérer le contexte d’exécution de l'utilisateur :

    class View_Login:

    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
     
    //Validation des champs pour empêcher les valeurs null ou vide et donc empêcher les connexion anonymes
    if (!txtLogin.getText().trim().isEmpty() && !new String (txtPassword.getPassword()).trim().isEmpty() && !txtDomain.getText().trim().isEmpty() )
     {
    	//On récupere l'instance du singleton et on lance la fonction OpenSessionAD pour créer le context d'execution (la session)
    	Singleton_AuthAD.getInstance().openSessionAD(txtLogin.getText(), new String (txtPassword.getPassword()), txtDomain.getText());
     
    	if (Singleton_AuthAD.getInstance().getExecutionContext() != null) {
    		JOptionPane.showMessageDialog( null, "Information : Authentification réussie :). ");
                    frmConnexion.setVisible(false);
    		View_ServicesMeteo servicesMeteoView = new View_ServicesMeteo();
    		View_ServicesMeteo.LaunchViewServicesMeteo();
    	}
    }				
    else
    {
    	JOptionPane.showMessageDialog( null, "Information : Veuillez remplir l'ensemble des champs svp :). ");
    }
    Class Singleton_AuthAD
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    import java.util.Hashtable;
     
    import javax.naming.AuthenticationException;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    import javax.swing.JOptionPane;
     
    public class Singleton_AuthAD {
     
    	private Context executionContext = null;
     
    	public Context getExecutionContext() {
    		return executionContext;
    	}
     
     
    	public void setExecutionContext(DirContext varExecutionContext) {
    		executionContext = varExecutionContext;
    	}
     
    	private static String CONNECTION_USERNAME = null;
        private static String CONNECTION_PASSWORD = "null";
    	private String FqdnDomainName = null;
    	private String PortLdap = "389";
    	private String SecurityMode = "simple";
     
    	/** Constructeur privé */
    	private Singleton_AuthAD()
    	{}
     
    	/** Holder */
    	private static class SingletonHolder
    	{		
    		/** Instance unique non préinitialisée */
    		private final static Singleton_AuthAD instance = new Singleton_AuthAD();
    	}
     
     
    	/** Point d'accès pour l'instance unique du singleton */
    	public static Singleton_AuthAD getInstance()
    	{	
    		return SingletonHolder.instance;
    	}
     
    	public void openSessionAD(String VarLogin, String VarPassword, String VarFqdnDomainName){
     
    		try {
    			CONNECTION_USERNAME = VarLogin;
    			CONNECTION_PASSWORD = VarPassword;
    			FqdnDomainName = VarFqdnDomainName;
    			// Set up the environment for creating the initial context
    			Hashtable<String, String> env = new Hashtable<String, String>();
    			env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
    			env.put("com.sun.jndi.ldap.read.timeout", "5000");
    			env.put(Context.PROVIDER_URL, "ldap://" + FqdnDomainName +":" + PortLdap);
     
    			// Authenticate as S. User and password "mysecret"
    			env.put(Context.SECURITY_AUTHENTICATION, SecurityMode);
    			env.put(Context.SECURITY_PRINCIPAL, CONNECTION_USERNAME + "@" + FqdnDomainName);
    			env.put(Context.SECURITY_CREDENTIALS, CONNECTION_PASSWORD);
     
    			// Create the initial context
    			executionContext = new InitialContext(env);
     
    		} catch (NamingException  e) {
     
     
    			JOptionPane.showMessageDialog( null, "Erreur : Merci de verifier que le domaine est disponible" +  
    					" et qu'il n'y a pas d'erreur dans les identifiants fournis " + 
    					System.getProperty("line.separator") + "Détails : " + e.getMessage() ,"Erreur",
    					JOptionPane.ERROR_MESSAGE);
    		}
     
    	}
    L'identification fonctionne très bien en revanche lorsque je veux exécuter ma commande powershell, il me dit que je n'ai pas les droits pour le faire alors que quand j'essaye en lançant le powershell en tant que l'utilisateur admin cela fonctionne parfaitement. en claire, je n'arrive pas a lier la commande runtime.exec() a mon contexte jndi

    Voici le code qui lance la commande powershell :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    public List<Class_Service> getAllServicesByServername(String serverName) {
     
    		Context executionContext = Singleton_AuthAD.getInstance().getExecutionContext();
     
    		if (executionContext != null) 
    		{
     
     
    			Charset encoding = Charset.forName("Cp850");
    			try {
     
    				  String command = "powershell.exe  Get-WmiObject -computername " + serverName + " -Class win32_service -Property DisplayName, Started, State, StartMode, StartName, Name , SystemName  | " +
    					"Sort-Object DisplayName | select -property DisplayName, Started, State, StartMode, StartName , Name, SystemName | ConvertTo-CSV -NoType";
     
    				  // Executing the command
    				  Process powerShellProcess = Runtime.getRuntime().exec(command);
    				  // Getting the results
    				  powerShellProcess.getOutputStream().close();
    				  String line;
    				  //Partie recupération de la sortie standard.
     
    				  BufferedReader stdout = new BufferedReader(new InputStreamReader(
    				    powerShellProcess.getInputStream(),encoding));
    				  int idService = 0;
    				  while ((line = stdout.readLine()) != null) {
     
     
    				   System.out.println(line);
     
    				   Class_Service service = new Class_Service();
    				   String[] colonnes = line.split(",");
    				   service.setId(idService);
    				   service.setDisplayName(colonnes[0]);
    				   service.setStarted(Boolean.getBoolean(colonnes[1]));
    				   service.setStatus(colonnes[2]);
    				   service.setTypeStartup(colonnes[3]);
    				   service.setAccountStartup(colonnes[4]);
    				   service.setName(colonnes[5]);
    				   service.setServerName(colonnes[6]);
     
    				   serviceList.add(service);
    				   idService = idService + 1;	   
    				  }
    				  stdout.close();
     
    				  //Partie Recupération des erreurs
    				  BufferedReader stderr = new BufferedReader(new InputStreamReader(
    				    powerShellProcess.getErrorStream(), encoding));
     
    				  System.out.println("Après Modification dans ServicesList : ");
    				  System.out.println(System.getProperty("user.name"));
    				  while ((line = stderr.readLine()) != null) {
    				   System.out.println(line);
    				  }
     
    				  stderr.close();
     
     
    			} catch (Exception e) {
    				// TODO: handle exception
    				System.out.println(e.getMessage());
    			}
     
    		}
     
    		return serviceList;
        }
    La réponse du powershell est la suivante :

    Get-WmiObject : Accès refusé. (Exception de HRESULT : 0x80070005 (E_ACCESSDENIE
    D))
    Au niveau de ligne*: 1 Caractère*: 14
    + Get-WmiObject <<<< -computername COMPUTER01 -Class win32_service -Property
    DisplayName, Started, State, StartMode, StartName, Name , SystemName | Sort-Ob
    ject DisplayName | select -property DisplayName, Started, State, StartMode, Sta
    rtName , Name, SystemName | ConvertTo-CSV -NoType
    + CategoryInfo : NotSpecified: ( [Get-WmiObject], UnauthorizedA
    ccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.Pow
    erShell.Commands.GetWmiObjectCommand
    Merci pour votre aide.

    Sharco

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Au hasard, sous windows tu as une commande runas qui permet de choisir le user te permettant peut être de t'en sortir. Mais je ne suis pas certains que tu puisse passer le mot de passe sans devoir le tapper dans la console.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par sharco Voir le message
    Bonjour à tous,

    L'application se lancera depuis un pc avec un compte qui n'a aucun droit. Le but est de demander un login/password pour exécuter le reste des actions d'administration.
    Sous windows, il me semble que si le compte n'a aucun droit, il ne peut pas non plus demander à passer administrateur!

    Citation Envoyé par sharco Voir le message
    en claire, je n'arrive pas a lier la commande runtime.exec() a mon contexte jndi
    Tu entends quoi par "lier la commande runtime.exec() à ton contexte jndi?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2011
    Messages : 5
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Si il est possible pour un utilisateur sans droit, d’exécuter une application sous windows en tant qu'un autre utilisateur qui aurait les droits. C'est d'ailleurs comme cela que j'ai testé ma commande powershell. J'ai exécuté Powershell ISE en tant d'AdminUser sur la session windows ClassicUser.

    Je sais qu'il existe des solutions de contournement telles que "exécuter l'application en tant que ..." depuis Windows, ou même renseigner le login password dans la commande Powershell. Mais c'est pas ce que veux.

    Lors du lancement de l'application, java récupère la session ClassicUser et lance en quelque sorte, toute les fonctions avec ce compte. Ce que j'ai fait, c'est que j'ai créé une page de login et a partir des éléments renseignés, je check dans l'AD si les informations sont ok et je créé un "contexte" AdminUser. Ce que j'appelle contexte, c'est une sorte d’environnement utilisateur avec les droits qui lui sont propre dans lequel le code doit s’exécuter.

    Le code en question est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String command = "powershell.exe  Get-WmiObject -computername " + serverName + " -Class win32_service -Property DisplayName, Started, State, StartMode, StartName, Name , SystemName  | " +
    					"Sort-Object DisplayName | select -property DisplayName, Started, State, StartMode, StartName , Name, SystemName | ConvertTo-CSV -NoType";
     
    // Executing the command
    	Process powerShellProcess = Runtime.getRuntime().exec(command);
    Mais je sais pas comment lier l'action à l’environnement (Contexte) AdminUser que j'ai créé afin que la commande powershell se lance en tant qu'AdminUser.

    Merci de votre aide.

    Sharco

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu l'a créé comment cet "environnement"? Je suppose que tu as lancé un process particulier avec des paramètres particulier. Donc c'est à ce process qu'il faut transmettre les commandes à exécuter.

    Edit: et si c'est de ce qui sort de openSessionAD dont tu parle, ben non. Ce n'est pas un "execution context" ou un truc du genre. C'est juste un DirContexte, un noeud dans un annuaire LDAP. Tout ce que le user/pass que t'a fournis te permettent, c'est d'aller voir les valeurs dans ces noeuds, éventuellement les modifier. Mais c'est toi. Ca ne donne aucun droit particulier au process java.

Discussions similaires

  1. architecture multi-tiers et contexte utilisateur
    Par cyrille37 dans le forum ASP.NET
    Réponses: 14
    Dernier message: 22/01/2008, 11h29
  2. [Context]Changer le contexte
    Par GLDavid dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 11/07/2007, 15h55
  3. [Java Wireless Toolkit] Changer version compilateur
    Par PoZZyX dans le forum Java ME
    Réponses: 5
    Dernier message: 06/07/2006, 14h09
  4. [JAVA] attente de réaction d'un utilisateur
    Par miel dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 27/04/2006, 07h47
  5. [Jboss][myEclipse] Comment changer le contexte d'une appli
    Par adilou1981 dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 28/03/2006, 00h33

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