Jump to content
Sign in to follow this  

Detecting NTFS symlinks

Recommended Posts

Thanks to many of you already who have posted example scripts and good questions that have already helped me on this project (unbeknownst to you). :)

I have written a program that updates and maintains a list of programs and games across a network. Some of them are copied from a central server to the clients, others are symlinked. They are all checked every time the computer starts up to make sure their version is current and critical files are present. I have however run into a quirk that I cannot find a solution for.

When an update is determined to be required, programs that are symlinked are simply deleted locally and re-linked using a file list from the server.

When an update is required for a program that is flagged as "copy", I call robocopy with flags telling it only to update files that are newer or not present.

The odd quirk that I have just found is that I have a game that I tried to run as a symlink, but it didn't like running multiple instances (locks data files during runtime). So I switched its flag to copy. However the script scans the directory, which is linked back to the master copy, and sees that everything is already up to date, because it's looking at itself. :(

What I need is a function to determine if a local file/directory is "real" or a symbolic link. I've looked through the help file but I can't find anything, and apparently nobody's posted anything about it on the forum, or I'm using the wrong keywords to search.

Share this post

Link to post
Share on other sites


Maybe this can help

Junction v1.02 - Win2K junction creator and reparse point viewer

Copyright © 2000 Mark Russinovich

Systems Internals - http://www.sysinternals.com

The first usage is for displaying reparse point information, and the

second usage is for creating or deleting a NTFS junction point:

usage: C:\Sys Internals\Junction\JUNCTION.EXE [-s] <file or directory>

-s Recurse subdirectories

usage: C:\Sys Internals\Junction\JUNCTION.EXE [-d] <junction directory> [<junction target>]

-d Delete the specified junction

example: junction d:\link c:\winnt

Download the Junction.exe from the MS site (previously called Sys Internals)



Share this post

Link to post
Share on other sites

GetFileAttributes can get the attributes of a symblic link though a flag for detecting a reparse point. The flag also does a symbolic link so not sure of it's accuracy ensuring for certain of symbolic link detection but it tests OK with my brief check with Vista SP1.

; example: returns true if the file is a symbolic link
$var = _ReparsePoint('C:\test.txt')
MsgBox(0, '', $var)

Func _ReparsePoint($string)
    If Not FileExists($string) Then
        Return SetError(1, 0, '')
    $rc = DllCall('kernel32.dll', 'Int', 'GetFileAttributes', 'str', $string)
    If IsArray($rc) Then
            Return True
    Return False


Edited by MHz

Share this post

Link to post
Share on other sites


This method doesn't seem to work on hardlinks created by fileCreateNTFSLink

Any ideas on how to detect these?

Thank you.

Share this post

Link to post
Share on other sites

Search the Forum for _IsJunction.

UDF List:

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Create New...