Citation Envoyé par eusebe19 Voir le message
Sur ce point, je peux te donner une demie piste : je n'ai pas essayé sur Vista ou Seven, mais je peux te garantir que cela fonctionne parfaitement sur Windows Server 2008, donc ce serait à priori ce serait OK pour Vista .
Bonjour à tous,
Je suis en train de développer une application winform (xaml) dans laquelle j'ai besoin d'effectuer une impersonation.

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
       [DllImport("advapi32.dll")]
         public static extern int LogonUserA(String lpszUserName,
             String lpszDomain,
             String lpszPassword,
             int dwLogonType,
             int dwLogonProvider,
             ref IntPtr phToken);
         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
         public static extern int DuplicateToken(IntPtr hToken,
             int impersonationLevel,
             ref IntPtr hNewToken);

         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
         public static extern bool RevertToSelf();

         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
         public static extern bool CloseHandle(IntPtr handle);
        

        public Form1()
        {
            InitializeComponent();
        }
        private bool impersonateValidUser(String userName, String domain,String password)
        {
            WindowsIdentity tempWindowsIdentity;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;

            if (RevertToSelf())
            {
                ShowCurrentUser();
                if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
                    LOGON32_PROVIDER_DEFAULT, ref token) != 0)
                {
                    if (DuplicateToken(token, 2 , ref tokenDuplicate) != 0)
                    {
                        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                        impersonationContext = tempWindowsIdentity.Impersonate();
                        ShowCurrentUser();
                        if (impersonationContext != null)
                        {
                            CloseHandle(token);
                            CloseHandle(tokenDuplicate);
                            return true;
                        }
                    }
                }
            }
            if (token != IntPtr.Zero)
                CloseHandle(token);
            if (tokenDuplicate != IntPtr.Zero)
                CloseHandle(tokenDuplicate);
            return false;
        }

        private void undoImpersonation()
        {
            impersonationContext.Undo();
        }

         private void btnImpersonate_Click(object sender, EventArgs e)
        {
            if (txtPath.Text != string.Empty)
            {
                bool impersonnate = impersonateValidUser(txtUserName.Text,txtDomain.Text, txtPassword.Text);
              if (impersonnate)
              {
                   // Do what ever you want after impersonating
                    CreateFile(txtPath.Text);
                    undoImpersonation();
                    // return to your currenct windows logon using Undo() method
                }
            }
        }
Le code ci-dessus fonctionne parfaitement sous XP, Server 2003 et server 2008. Par contre sous Seven aie aie......
L'impersonation avec un utilisateur Admin de la machine se fait bien mais par contre l'action (Ecrire à la racine du C par exemple) ne se fait pas. On a une erreur 1346 (Erreur)

Either a required impersonation level was not provided, or the provided impersonation level is invalid. (1346)
Si quelqu'un a une idée ? je bosse dessus depuis 2 jours et je ne comprend pas.

@+