Get AppData\Local folder for logged user
Asked Answered
T

1

5

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

Triumph answered 2/8, 2017 at 10:47 Comment(7)
Why is this program needing admin rights? It is not "the best solution" - to grant admin right to all programs (it is workaround)Agosto
@Agosto It is an installer program and administrative privileges are required (writing to registry, Program Files, etc..)Triumph
@Pikoh This question relates to how to get AppData\Local path of specific user, it does not deal with getting current user name, signature or credentials.Triumph
In your question you say for logged user. So you need to know what is the logged user from an application running as administrator. And that's what the possible duplicate deals with if i'm not wrongFae
@Fae True, but getting the logged user signature is not that difficult compared to getting AppData\Local path for arbitrary user.Triumph
You are right. Anyway, it seems you can't do what you want without knowing the username/password(see this question )...Fae
see that - #2779843Kellum
F
2

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

Fae answered 2/8, 2017 at 11:59 Comment(3)
Not the most elegant way, but it works. Clever solution, thanks!Triumph
hello! sorry if this is a dumb question, but will this work on windows service? thank you!Carsick
@Carsick never tried it, but it may work...The problem may be restarting itself. See this question.If you try it please keep me informed :)Fae

© 2022 - 2024 — McMap. All rights reserved.