Mercurial > trustbridge
diff common/util.c @ 1010:1c1964c27b39 runafterinstall
(issue54) commit work in progress on start after installation
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Tue, 02 Sep 2014 14:25:40 +0200 |
parents | 427e2e18b8c8 |
children | fd85a02d771d |
line wrap: on
line diff
--- a/common/util.c Tue Sep 02 10:54:51 2014 +0200 +++ b/common/util.c Tue Sep 02 14:25:40 2014 +0200 @@ -16,6 +16,7 @@ #include <grp.h> #include <string.h> #else +#include <winsafer.h> #include <windows.h> #include <accctrl.h> #include <aclapi.h> @@ -724,3 +725,56 @@ return retval; } #endif + +#ifdef WIN32 +/** @brief get a restricted access token + * + * This function uses the Software Restriction API to obtain the + * access token for a process run als normal user. + * + * @returns A restricted handle or NULL on error. + */ +HANDLE +get_restricted_token() +{ + SAFER_LEVEL_HANDLE user_level = NULL; + HANDLE retval = NULL; + if (!SaferCreateLevel(SAFER_SCOPEID_USER, + SAFER_LEVELID_NORMALUSER, + SAFER_LEVEL_OPEN, &user_level, NULL)) + { + PRINTLASTERROR ("Failed to create user level.\n"); + return NULL; + } + + if (!SaferComputeTokenFromLevel(user_level, NULL, &retval, 0, NULL)) + { + SaferCloseLevel(user_level); + return NULL; + } + + return retval; +} + +HANDLE +get_normal_token() +{ + SAFER_LEVEL_HANDLE user_level = NULL; + HANDLE retval = NULL; + if (!SaferCreateLevel(SAFER_SCOPEID_USER, + SAFER_LEVELID_NORMALUSER, + SAFER_LEVEL_OPEN, &user_level, NULL)) + { + PRINTLASTERROR ("Failed to create user level.\n"); + return NULL; + } + + if (!SaferComputeTokenFromLevel(user_level, NULL, &retval, 0, NULL)) + { + SaferCloseLevel(user_level); + return NULL; + } + + return retval; +} +#endif