获取已登录用户的AppData\Local文件夹

5

我目前正在使用:

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

获取当前用户的 AppData\Local 路径。该程序需要提升的权限运行,如果在标准用户会话下运行,则会弹出提示要求管理员登录凭据。以管理员身份登录(不同的用户)显然会更改程序的活动用户。因此,返回的文件夹路径是管理员的而不是标准用户使用的路径。

预期结果:

C:\Users\StandardUser\AppData\Local

实际结果:

C:\Users\Administrator\AppData\Local

有没有一种方法可以获取特定用户的AppData\Local路径?相比于获取任意用户的路径,获取已登录用户的用户名或凭据不是问题。该应用程序基于WPF,并通过requestedEcecutionLevel (requireAdministrator)在清单文件中设置其所需的权限。

为什么这个程序需要管理员权限?授予所有程序管理员权限并不是“最佳解决方案”(这只是一种权宜之计)。 - Piotr
@Pikoh 这个问题涉及如何获取特定用户的AppData\Local路径,而不是获取当前用户名称、签名或凭据。 - Vilda
在你的问题中,你说“对于已登录的用户”。因此,您需要知道作为管理员运行的应用程序中已登录用户是谁。如果我没记错的话,这就是可能重复的内容所涉及的内容。 - Pikoh
@Pikoh 确实如此,但与获取任意用户的AppData\Local路径相比,获取已登录用户的签名并不那么困难。 - Vilda
1
你说得对。无论如何,似乎如果不知道用户名/密码,你想做的事情是做不到的(参见这个问题)... - Pikoh
显示剩余2条评论
1个回答

2
要想为另一个用户获取该信息,您需要知道该用户的用户名/密码,如此问题所述。
因此,我想提供一种替代解决方案:
1. - 不要使用requestedExecutionLevel来运行应用程序,而是将其删除并以已登录的用户身份运行。这样,您可以轻松访问特殊文件夹路径并记录它。
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自我提升


不是最优雅的方式,但它能够工作。聪明的解决方案,谢谢! - Vilda
你好!抱歉如果这是一个愚蠢的问题,但这个程序能在Windows服务上运行吗?谢谢! - jgmdv
@jgmdv 从未尝试过,但可能有效...问题可能会重新开始。请参见此问题。如果您尝试,请告诉我 :) - Pikoh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接