问题
I'm currently using:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
To retrieve current user's AppData\Local
path. The program requires elevated privileges and running it under standard user session throws a prompt requiring administrator's login credentials. Logging as an administrator (different user) apparently changes active user for the program. The returned folder path is thus administrator's and not the one the standard user uses.
Expected result:
C:\Users\StandardUser\AppData\Local
Actual result:
C:\Users\Administrator\AppData\Local
Is there a way to get AppData\Local path of specific user? Getting logged user name or credentials is not an issue compared to getting the path for arbitrary user. The application is WPF based and its required privileges are set in manifest file by requestedEcecutionLevel (requireAdministrator)
.
回答1:
To get that information for another user, you'll need to know that user username/password, as is explained in this question.
So I'd like to throw an alternative solution:
1.- Instead of using the requestedExecutionLevel
for the aplication, remove it and run it as the logged user. That way you'll have access to the special folders path easily and may log it.
2.- Restart your application as Administrator.
Sample code (in 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);
}
This sample code is for a WPF Application, but could be done the same in a winforms Application.
Reference: UAC Self Elevation
来源:https://stackoverflow.com/questions/45458728/get-appdata-local-folder-for-logged-user