Search code examples
c#impersonationspecial-folders

Environment.SpecialFolder and Impersonation


I use Visual Studio 2013, Windows 8.1.

I try get Environment.SpecialFolder values from Impersonate user, but I get always empty string value.

Any suggestions?.

My test code:

    [TestMethod]
    public void Environment_Folders_is_ok()
    {
        Console.WriteLine("CURRENT USER " + Environment.UserName);
        GlobalVariables.MyDocumentsPath = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        Console.WriteLine(GlobalVariables.MyDocumentsPath);

        var p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
        Console.WriteLine(p1);
        p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        Console.WriteLine(p1);
        p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
        Console.WriteLine(p1);
        p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);
        Console.WriteLine(p1);

        var user = new Utils().DecryptValue(ConfigurationManager.AppSettings["User"]);
        var password = new Utils().DecryptValue(ConfigurationManager.AppSettings["Password"]);
        var domain = new Utils().DecryptValue(ConfigurationManager.AppSettings["Domain"]);

        GlobalVariables.Impersonate = true;

        using (new Impersonator(user, domain, password))
        {
            Console.WriteLine("IMPERSONATE with " +  user);
            p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            Console.WriteLine(p1);
            p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
            Console.WriteLine(p1);
            p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            Console.WriteLine(p1);
            p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            Console.WriteLine(p1);

       }

    }

Output:

CURRENT USER MyUser

C:\Users\MyUser\Documents
C:\Users\MyUser
C:\Users\MyUser\Desktop
C:\Users\MyUser\Desktop

IMPERSONATE with user2

Update:

As well as, I use FolderBrowserDialog and method ShowDialog and I get error

Unable to retrieve the root folder

when I use impersonation user

            try
            {
                Console.WriteLine("FolderBrowserDialog. IMPERSONATE WITH " + user);
                using (var fbd = new FolderBrowserDialog())
                {
                    Console.WriteLine(fbd.RootFolder);

                    p1 = System.Environment.GetFolderPath(fbd.RootFolder);
                    Console.WriteLine(p1);

                    DialogResult result = fbd.ShowDialog();
                }
            }
            catch (System.InvalidOperationException ex)
            {
                Assert.AreEqual("Unable to retrieve the root folder.", ex.Message, "No se esperaba " + ex.Message);
            }

Output:

FolderBrowserDialog. IMPERSONATE with user2
Desktop


Solution

  • I use LOGON32_LOGON_NEW_CREDENTIALS (LogonType.LOGON32_LOGON_NEW_CREDENTIALS, LogonProvider.LOGON32_PROVIDER_WINNT50) to Impersonate

    https://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials/

    and I get the same paths than user MyUser.

    My code:

       using (new Impersonator(user, domain, password
                       , LogonType.LOGON32_LOGON_NEW_CREDENTIALS, LogonProvider.LOGON32_PROVIDER_WINNT50
                    ))
      {
         Console.WriteLine("IMPERSONATE LOGON32_LOGON_NEW_CREDENTIALS with " + user);
             p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
             Console.WriteLine(p1);
             p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
             Console.WriteLine(p1);
             p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
             Console.WriteLine(p1);
             p1 = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
             Console.WriteLine(p1);
         }
    

    Output:

    IMPERSONATE LOGON32_LOGON_NEW_CREDENTIALS with user2

    C:\Users\MyUser\Documents
    C:\Users\MyUser
    C:\Users\MyUser\Desktop
    C:\Users\MyUser\Desktop