mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-27 15:07:03 +01:00
Fix and improve windows symbolic link creation
This commit is contained in:
@@ -21,11 +21,23 @@ namespace Tgstation.Server.Host.IO
|
||||
throw new ArgumentNullException(nameof(linkPath));
|
||||
|
||||
//check if its not a file
|
||||
var flags = File.Exists(targetPath) ? 2 : 3; //SYMBOLIC_LINK_FLAG_DIRECTORY and SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE on win10 1607+ developer mode
|
||||
var flags = File.Exists(targetPath) ? NativeMethods.CreateSymbolicLinkFlags.None : NativeMethods.CreateSymbolicLinkFlags.Directory;
|
||||
|
||||
flags |= NativeMethods.CreateSymbolicLinkFlags.AllowUnprivilegedCreate;
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
if (!NativeMethods.CreateSymbolicLink(linkPath, targetPath, flags))
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
{
|
||||
var error = Marshal.GetLastWin32Error();
|
||||
if (error == 87) //INVALID_PARAMETER, SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE isn't supported
|
||||
{
|
||||
flags &= ~NativeMethods.CreateSymbolicLinkFlags.AllowUnprivilegedCreate;
|
||||
if (NativeMethods.CreateSymbolicLink(linkPath, targetPath, flags))
|
||||
return;
|
||||
error = Marshal.GetLastWin32Error();
|
||||
}
|
||||
throw new Win32Exception(error);
|
||||
}
|
||||
}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,17 @@ namespace Tgstation.Server.Host
|
||||
/// </summary>
|
||||
static class NativeMethods
|
||||
{
|
||||
/// <summary>
|
||||
/// See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinka#parameters
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum CreateSymbolicLinkFlags : int
|
||||
{
|
||||
None = 0,
|
||||
Directory = 1,
|
||||
AllowUnprivilegedCreate = 2
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowthreadprocessid
|
||||
/// </summary>
|
||||
@@ -54,6 +65,6 @@ namespace Tgstation.Server.Host
|
||||
/// See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinkw
|
||||
/// </summary>
|
||||
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags);
|
||||
public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, CreateSymbolicLinkFlags dwFlags);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user