Index: Modules/posixmodule.c =================================================================== --- Modules/posixmodule.c (revision 83058) +++ Modules/posixmodule.c (working copy) @@ -5118,6 +5118,39 @@ Py_INCREF(Py_None); return Py_None; } + +PyDoc_STRVAR(enable_symlink__doc__, +"enable_symlink() -> bool\n\n\ +Attempt to enable the SeCreateSymbolicLinkPrivilege for the calling user."); + +static PyObject * +enable_symlink(PyObject *self) +{ + const char *priv = "SeCreateSymbolicLinkPrivilege"; + HANDLE tok; + TOKEN_PRIVILEGES tok_priv; + LUID luid; + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &tok)) + return win32_error("enable_symlink", NULL); + + if (!LookupPrivilegeValue(/*local*/ NULL, priv, &luid)) + return win32_error("enable_symlink", NULL); + + tok_priv.PrivilegeCount = 1; + tok_priv.Privileges[0].Luid = luid; + tok_priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + if (!AdjustTokenPrivileges(tok, FALSE, &tok_priv, + sizeof(TOKEN_PRIVILEGES), + (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL)) + return win32_error("enable_symlink", NULL); + + if(GetLastError() == ERROR_NOT_ALL_ASSIGNED) + Py_RETURN_FALSE; + else + Py_RETURN_TRUE; +} #endif /* !defined(HAVE_SYMLINK) && defined(MS_WINDOWS) */ #ifdef HAVE_TIMES @@ -7599,6 +7632,8 @@ #if !defined(HAVE_SYMLINK) && defined(MS_WINDOWS) {"symlink", (PyCFunction)win_symlink, METH_VARARGS | METH_KEYWORDS, win_symlink__doc__}, + {"enable_symlink", (PyCFunction)enable_symlink, METH_VARARGS, + enable_symlink__doc__}, #endif /* !defined(HAVE_SYMLINK) && defined(MS_WINDOWS) */ #ifdef HAVE_SYSTEM {"system", posix_system, METH_VARARGS, posix_system__doc__},