我如何从Windows服务获取用户桌面路径?

问题描述 投票:0回答:3

这是我的代码,如果快捷方式不存在,我需要我的服务在用户桌面上创建应用程序的快捷方式。当我在 Visual Studio 中调试应用程序时,它会将快捷方式放在我的桌面上,但是当我在 Windows 上运行该服务时,它总是会将快捷方式放在 C 驱动器上而不是我的桌面上。

  private void CreateShortcut()
    {
        object shDesktop = (object)"Desktop";
        WshShell shell = new WshShell();
        //string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        string shortcutAddress = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\CadEisancy.lnk";
        IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress);
        shortcut.Description = "New shortcut for a Notepad";
        shortcut.Hotkey = "Ctrl+Shift+N";
        shortcut.TargetPath = @"C:\RankWindowsApp\RankWindowsApp\bin\Debug\RankWindowsApp.exe";
        shortcut.IconLocation = @"C:\RankWindowsApp\Icon.ico";
        shortcut.Save();
    }
    protected override void OnStart(string[] args)
    {
        //Create Shortcut On Desktop
        CreateShortcut();
    }

我的代码:

![我的代码][1]

c# .net windows-services
3个回答
0
投票

解决方案是获取当前登录的用户会话代码,然后根据会话获取他的个人资料名称,最后我们可以指定他的桌面路径。


0
投票

您的服务是如何配置的?如果您不是在用户帐户下运行,该服务将使用自己的配置文件,如您在输出中看到的那样。

我在下面的内容中回答了大部分类似的答案。如果您觉得有帮助,请看看。

https://stackoverflow.com/a/46540108/1556780


0
投票

从运行为

Service
NT AUTHORITY\SYSTEM

在本地计算机上创建桌面列表

方法

public static List<string> GetComputerUsersWithDesktops()
{
    List<string> desktops = new List<string>();

    string path = string.Format("WinNT://{0},computer", Environment.MachineName);

    using (var computerEntry = new DirectoryEntry(path))
    {
        foreach (DirectoryEntry childEntry in computerEntry.Children)
        {
            if (childEntry.SchemaClassName == "User")
            {
                string desktop = "C:\\Users\\" + childEntry.Name + "\\Desktop";

                if (Directory.Exists(desktop))
                {
                    desktops.Add(desktop);
                }
            }
        }
    }

    return desktops;
}

输出示例

有效桌面将输出为不带尾随的字符串列表

\

C:\Users\SAM\Desktop
C:\Users\DAVE\Desktop

使用示例

在此示例中,我使用桌面路径将已存在的快捷方式复制到每个有效桌面

private static void CopyFirewallShortcut()
{
    List<string> desktops = Env.GetComputerUsersWithDesktops();

    foreach (string desktop in desktops)
    {
        string fw = desktop + "\\Firewall.lnk";

        string fws = "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Administrative Tools\\Windows Defender Firewall with Advanced Security.lnk";

        if (!File.Exists(fw) && File.Exists(fws))
        {
            File.Copy(fws, fw);
        }
    }
}

Tested on Windows 10 22H2 - 19045.4717

© www.soinside.com 2019 - 2024. All rights reserved.