La première méthode me donne une exception win32, je ne sais pas pourquoi... (Je continue de chercher mais pour le moment j'ai rien trouvé)
[EDIT] Si je mets le user / mdp en commentaire le programme fonctionne très bien. J'ai trouvé ceci, mais dans mon cas ça ne m'aide pas parce que ce n'est pas un shortcut que je voudrais éxecuter
Voilà le test que j'ai déjà fait :
System.Diagnostics.Process proc = new System.Diagnostics.Process();
System.Security.SecureString ssPwd = new System.Security.SecureString();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = @"C:\Program Files\NetBeans 8.2\bin\netbeans.exe"; //c'est un exemple au pif
proc.StartInfo.Arguments = "";
proc.StartInfo.Domain = "domain";
proc.StartInfo.UserName = "user";
string password = "1234";
for (int x = 0; x < password.Length; x++)
{
ssPwd.AppendChar(password[x]);
}
proc.StartInfo.Password = ssPwd;
proc.Start();
L'objectif final serait de pouvoir exécuter directement l'app avec un autre user sans passer par une app externe (j'avoue avoir un doute sur la faisabilité de la chose)
Sans ça je veux bien essayer de passer par une autre app qui lance celle désiré avec un autre user
- Edité par SnowH52 7 septembre 2017 à 11:52:05
N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
Je désignais par "la première méthode" celle que j'ai mis dans mon message précédent
Le message d'erreur est le suivant :
An unhandled exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
Additional information: The directory name is invalid
Et pourtant le directory name est correct (j'ai copié collé depuis l'explorateur windows...) et d'autant plus que si je vire les credentials netbeans se lance correctement
Le besoin initial est de lancer une app avec un user. Je doute que ce soit faisable avec cette classe. Si vous avez une autre solution à me proposer n'hésitez pas
Je suis parti sur cette solution alternative parce que je n'ai pas trouver une solution autrement.
Si vous voulez voir tout le code de la classe le voici, attention les yeux ça pique... J'ai codé dans un projet à part pour faire des tests donc c'est pas hyper propre
class Auth
{
String user;
SecureString safePswd;
String pass;
public Auth()
{
user = "test";
pass = "1234";
safePswd = new SecureString();
foreach (char c in pass)
{
safePswd.AppendChar(c);
}
launchApp();
}
public void launchApp()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
System.Security.SecureString ssPwd = new System.Security.SecureString();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = @"C:\Program Files\NetBeans 8.2\bin\netbeans.exe";
proc.StartInfo.Arguments = "";
proc.StartInfo.Domain = "domain";
proc.StartInfo.UserName = user;
string password = pass;
for (int x = 0; x < password.Length; x++)
{
ssPwd.AppendChar(password[x]);
}
proc.StartInfo.Password = ssPwd;
proc.Start();
}
}
et pour le reste il n'y a rien de spécial, je crée juste un objet de la classe ci-dessus
public partial class Form1 : Form
{
Auth a;
public Form1()
{
InitializeComponent();
a = new Auth();
}
}
N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
Vous avez vérifié dans le même contexte d'exécution que celui du processus créé ?
Je vous signale que les droits et les systèmes de fichier sont fonction de l'utilisateur, de son type de compte (interactif ou pas), de la session de sécurité associé programme, etc...
>et d'autant plus que si je vire les credentials netbeans se lance correctement
Encore plus d'argument pour le vérifier dans le même contexte d'exécution que celui du processus créé.
>Le besoin initial est de lancer une app avec un user. Je doute que ce soit faisable avec cette classe.
C'est tout à fait faisable mais entraîne de la complexité non négligeable.
J'insiste sur le fait que c'est une solution a un problème mais très certaine pas le "vrai" besoin initial.
Pensez à répondre mentalement au Pourquoi du Pourquoi du Pourquoi etc... (6 fois minimum selon une croyance populaire).
Votre approche est, pour moi, très très discutable, car vous avez une information extrêmement sensible (le mot de passe d'un utilisateur) extrêmement facile à récupérer, car dans le code binaire du programme.
>Si vous avez une autre solution à me proposer n'hésitez pas
Pour ce type d'acrobatie, il est très souvent préférable de passer par des mécanismes de type Service Windows ( un compte y est associé), les tâches planifiées ( un compte y est associé), ou une approche type serveur IIS qui ont des mécanismes "d'impersonnalisation" pour prendre automatiquement l'identité de la personne qui s'y authentifie (en plus des comptes IIS associés), etc...
>Je suis parti sur cette solution alternative parce que je n'ai pas trouver une solution autrement.
Heu, on est d'accord que c'est un peu le pire des arguments, non ?
>J'ai codé dans un projet à part pour faire des tests
Très bien.
Manque plus qu'à faire les vérifications dans le BON environnement "d'exécution", et aussi de voir le contenu des InnerException et les callstack de chacune.
Les exceptions, c'est bourré d'information, mais faut prendre le temps de les lire.
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
En fait mon client avait mal formulé sa demande car en réalité ce n'était pas nécessaire de lancer toute l'app avec un utilisateur mais juste une partie du code (celle qui lisait les fichiers en particulier). Donc d'un certain point de vu Bacelar avait raison d'une certaine manière...
DONC, finalement j'ai pu utiliser ceci, ce qui m'a vraiment beaucoup simplifier la tâche.
Voilà, j'espère que ça sera utile à d'autres...
Bonne journée
N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
En gros l'application doit lire des fichiers et les modifier.
Le "problème" était que ces fichiers ne pouvaient être accéder que par 1 utilisateur en particulier. Donc j'ai simplement effectué la lecture du fichier et l'écriture de celui-ci avec un utilisateur particulier de cette manière : (attention, il faut créé la classe Impersonator avec le code donné dans le lien précédent).
using (new Impersonator("user", "domain.net", "1234"))
{
//lecture / écriture du fichier
}
Le mot de passe est en claire, certe mais après avoir vérifier les fichiers binaire sont crypté de base et mon client est satisfait de cette solution
J'espère que ça sera utile à d'autres.
- snow
Ps : si vous désirez le code la classe impersonator merci de me contacter par MP. Je ne le posterai pas publiquement pour des questions de respect envers la créateur de cette classe (et que celui-ci demande à la base une inscription sur son site pour y avoir accès).
- Edité par SnowH52 26 septembre 2017 à 12:54:00
N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
Alors que me proposez-vous comme implémentation plus safe sans que je doive me prendre la tête?
ça ne peut qu'être bénéfique pour moi au final
- Edité par SnowH52 27 septembre 2017 à 14:01:56
N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
[C#] Executer une app en tant que tel ou tel user
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.