diff options
author | William A. Rowe Jr <wrowe@apache.org> | 2001-07-27 07:11:07 +0000 |
---|---|---|
committer | William A. Rowe Jr <wrowe@apache.org> | 2001-07-27 07:11:07 +0000 |
commit | 805d196bc02dd023d54ac0e77b049ee51ebe5bce (patch) | |
tree | c66845c51a3ea15b7d81aa3e0e84f030ea27df52 /user | |
parent | e4d0310d136ee6eaa08669a464c4e33a5b402b2f (diff) | |
download | apr-805d196bc02dd023d54ac0e77b049ee51ebe5bce.tar.gz |
Here's an implementation, dunno if it's _the_ implementation we are
looking for.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@62043 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'user')
-rw-r--r-- | user/win32/userinfo.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/user/win32/userinfo.c b/user/win32/userinfo.c index 8636d174a..66f9abb4a 100644 --- a/user/win32/userinfo.c +++ b/user/win32/userinfo.c @@ -189,6 +189,39 @@ APR_DECLARE(apr_status_t) apr_get_home_directory(char **dirname, const char *use return APR_SUCCESS; } +APR_DECLARE(apr_status_t) apr_current_userid(apr_uid_t *uid, + apr_gid_t *gid, + apr_pool_t *p) +{ + HANDLE threadtok; + DWORD needed; + TOKEN_USER *usr; + TOKEN_PRIMARY_GROUP *grp; + + if(!OpenProcessToken(GetCurrentProcess(), STANDARD_RIGHTS_READ | READ_CONTROL | TOKEN_QUERY, &threadtok)) { + return apr_get_os_error(); + } + + *uid = NULL; + if (!GetTokenInformation(threadtok, TokenUser, NULL, 0, &needed) + && (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + && (usr = apr_palloc(p, needed)) + && GetTokenInformation(threadtok, TokenUser, usr, needed, &needed)) + *uid = usr->User.Sid; + else + return apr_get_os_error(); + + if (!GetTokenInformation(threadtok, TokenPrimaryGroup, NULL, 0, &needed) + && (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + && (grp = apr_palloc(p, needed)) + && GetTokenInformation(threadtok, TokenPrimaryGroup, grp, needed, &needed)) + *gid = grp->PrimaryGroup; + else + return apr_get_os_error(); + + return APR_SUCCESS; +} + APR_DECLARE(apr_status_t) apr_get_userid(apr_uid_t *uid, apr_gid_t *gid, const char *username, apr_pool_t *p) { |