Noel
Noel

Reputation: 145

CreateSymbolicLink runs on Windows 8 returns error code 1314 on Windows 7

I am trying to create a symbolic link from a custom action dll using Wix installer.

The custom action is run as an administrator and I confirmed it by using code from:

http://code.msdn.microsoft.com/windowsdesktop/CppUACSelfElevation-5bfc52dd

The problem is that on Windows 8 the symbolic link is created, however on Windows 7 error 1314 is returned:

ERROR_PRIVILEGE_NOT_HELD1314 (0x522)
A required privilege is not held by the client.

Both Windows 7 and Windows 8 users are capable of running the process as administrators.

Any idea how I can solve this issue please?

Regards,
Noel

Upvotes: 0

Views: 1333

Answers (2)

Noel
Noel

Reputation: 145

What I found out is that with an MSI installer on Windows 7 or Vista Windows will not let you create a Symbolic link even if the installer is run as an administrator. What I ended up doing is by wrapping the .msi installer into an .exe using InnoSetup and ran the symbolic link commands from the executable.

On windows 8 this works because the Installer version has changed.

Hope this helps :)

Upvotes: 0

Peter Ritchie
Peter Ritchie

Reputation: 35869

The error isn't telling you you don't have access rights, it's telling you you don't have privilege. Certain privileges need to be requested explicitly under certain versions of the OS. Windows 7 seemed to to have SeCreateSymbolicLinkPrivilege off even with administrator access.

Pseudo code, but I believe you have to adjust privileges for your process token before calling CreateSymbolicLink

LUID luid;
if(LookupPrivilegeValue(NULL, _T("SeCreateSymbolicLinkPrivilege"), &luid))
{
    HANDLE hToken = get_process_token();
    TOKEN_PRIVILEGES token_privileges;
    token_privileges.PrivilegeCount             = 1;
    token_privileges.Privileges[0].Luid         = luid;
    token_privileges.Privileges[0].Attributes   = SE_PRIVILEGE_ENABLED;
    if(!AdjustTokenPrivileges(hToken, FALSE, &token_privileges, 0, NULL, NULL))
    {
        // TODO: call GetLastError and report an error.
    }
}

Upvotes: 1

Related Questions