2017-03-14 29 views
1

我使用Visual Studio 2013,Windows 8.1。Environment.SpecialFolder和Impersonation

我試着從模擬用戶得到Environment.SpecialFolder值,但我總是得到空字符串值

有什麼建議嗎?

我的測試代碼:

[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); 

     } 

    } 

輸出:

CURRENT USER MYUSER

C:\用戶\ MYUSER \文件
C:\用戶\ MYUSER
C:\ Users \ MyUser \ Desktop
C:\ Users \ M yUser \桌面

與user2的IMPERSONATE

更新:

除了,我用FolderBrowserDialog和方法ShowDialog,我得到錯誤

無法檢索根文件夾

當我使用模擬用戶

  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); 
      } 

輸出:

的FolderBrowserDialog。與用戶2 IMPERSONATE
桌面

回答

0

我用LOGON32_LOGON_NEW_CREDENTIALSLogonType.LOGON32_LOGON_NEW_CREDENTIALS, LogonProvider.LOGON32_PROVIDER_WINNT50)到冒充

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

我得到比用戶MYUSER相同的路徑。

我的代碼:

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); 
    } 

輸出:

IMPERSONATE LOGON32_LOGON_NEW_CREDENTIALS與用戶2

C:\用戶\ MYUSER \文件
C:\用戶\ MYUSER
C:\ Users \ MyUser \ Desktop
C:\ Users \ MyUser \ Desktop

相關問題