Powertoys Run:允许使用符号链接

f1tvaqid  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(52)

Microsoft PowerToys版本

0.72.0

安装方法

WinGet

以管理员身份运行

是的

存在问题的区域?

PowerToys Run

重现问题的步骤

cd "%APPDATA%\Microsoft\Windows\Start Menu\"
mklink /D SomeDirWithExeOrLnk ..\..\..\..\..\OneDrive\SomeDirWithExeOrLnk\
mklink /J OtherDirWithExeOrLnk %OneDriveConsumer%\OtherDirWithExeOrLnk

启动PT Run并尝试运行例如位于符号链接目录中的exe文件。

预期行为

允许使用符号链接。

diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/Win32Program.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/Win32Program.cs
index 9f22fd0..64c1d04 100644
--- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/Win32Program.cs
+++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/Win32Program.cs
@@ -736,11 +736,23 @@ namespace Microsoft.Plugin.Program.Programs
                     {
                         // https://learn.microsoft.com/dotnet/api/system.io.enumerationoptions?view=net-6.0
                         // Exclude directories with the Reparse Point file attribute, to avoid loops due to symbolic links / directory junction / mount points.
-                        AttributesToSkip = FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReparsePoint,
+                        AttributesToSkip = FileAttributes.Hidden | FileAttributes.System, // | FileAttributes.ReparsePoint,
                         RecurseSubdirectories = false,
                     }))
                     {
-                        folderQueue.Enqueue(childDirectory);
+                        var attrs = File.GetAttributes(childDirectory);
+                        if (attrs.HasFlag(FileAttributes.ReparsePoint))
+                        {
+                            var fsi = System.IO.Directory.ResolveLinkTarget(childDirectory, true);
+                            if (fsi is DirectoryInfo di)
+                            {
+                                folderQueue.Enqueue(di.FullName);
+                            }
+                        }
+                        else
+                        {
+                            folderQueue.Enqueue(directory);
+                        }
                     }
                 }
                 catch (Exception e) when (e is SecurityException || e is UnauthorizedAccessException)

实际行为

在查找程序时,忽略符号链接。
Win32Program.cs#L739

njthzxwz

njthzxwz1#

我们故意添加了那行代码,是因为人们存在递归循环,导致无限查询。

j91ykkif

j91ykkif2#

我已经阅读了评论行,但在将路径添加到列表之前解决符号链接的问题,这是否可以解决这个问题?
这是我唯一可以添加一些自定义路径的方法,该路径会递归扫描。

相关问题