2017-08-02 56 views
4

本地文件夾,我目前使用:獲取應用程序數據爲登錄用戶

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) 

獲取當前用戶的AppData\Local路徑。該程序需要提升的權限,並在標準用戶會話下運行它會引發需要管理員登錄憑據的提示。以管理員(不同用戶)身份登錄顯然會更改程序的活動用戶。返回的文件夾路徑因此是管理員的,而不是標準用戶使用的路徑。

預期結果:

C:\Users\StandardUser\AppData\Local 

實際結果:

C:\Users\Administrator\AppData\Local 

有沒有辦法讓應用程序數據\特定用戶的本地路徑?與獲取任意用戶的路徑相比,獲取記錄的用戶名或憑證不是問題。該應用程序是基於WPF的,它的必需權限是由requestedEcecutionLevel (requireAdministrator)在清單文件中設置的。

+0

爲什麼需要這個程序管理員權限?它不是「最好的解決方案」 - 授予管理員權限給所有程序(這是解決方法) – Piotr

+0

@Piotr它是一個安裝程序和管理權限是必需的(寫入註冊表,程序文件等) – ViliX64

+0

@Pikoh This問題涉及如何獲取特定用戶的AppData \ Local路徑,它不涉及獲取當前用戶名,簽名或憑證。 – ViliX64

回答

2

要爲其他用戶獲取該信息,您需要知道該用戶的用戶名/密碼,如this question中所述。

所以我想拋出一個替代的解決方案:

1.-而不是使用requestedExecutionLevel爲aplication,取出並運行它作爲登錄的用戶。這樣您就可以輕鬆訪問特殊文件夾路徑並可以記錄它。

2.-以管理員身份重新啓動您的應用程序。

示例代碼(在App.xaml.cs):

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    if (!IsRunAsAdmin()) 
    { 
     // here you should log the special folder path 
     MessageBox.Show(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)); 
     // Launch itself as administrator 
     ProcessStartInfo proc = new ProcessStartInfo(); 
     proc.UseShellExecute = true; 
     proc.WorkingDirectory = Environment.CurrentDirectory; 
     proc.FileName = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); 
     proc.Verb = "runas"; 

     try 
     { 
      Process.Start(proc); 
     } 
     catch 
     { 
      // The user refused the elevation. 
      // Do nothing and return directly ... 
      return; 
     } 

     System.Windows.Application.Current.Shutdown(); // Quit itself 
    } 
    else 
    { 
     MessageBox.Show("The process is running as administrator", "UAC"); 
    } 
} 

internal bool IsRunAsAdmin() 
{ 
    WindowsIdentity id = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(id); 
    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 

此示例代碼是一個WPF應用程序,但可以做的WinForms應用程序一樣。

參考:UAC Self Elevation

+0

不是最優雅的方式,但它的工作原理。聰明的解決方法,謝謝! – ViliX64

相關問題