Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get AppData\Local folder for logged user

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).

like image 341
Vilda Avatar asked Oct 29 '22 04:10

Vilda


1 Answers

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

like image 77
5 revs, 4 users 77%SuperG Avatar answered Nov 13 '22 22:11

5 revs, 4 users 77%SuperG