feisty meow concerns codebase 2.140
win32_security.cpp
Go to the documentation of this file.
1
2
3
4/*****************************************************************************\
5* *
6* Name : win32_security *
7* Author : Sue Richeson *
8* Author : Chris Koeritz *
9* *
10*******************************************************************************
11* Copyright (c) 2000-$now By Author. This program is free software; you can *
12* redistribute it and/or modify it under the terms of the GNU General Public *
13* License as published by the Free Software Foundation; either version 2 of *
14* the License or (at your option) any later version. This is online at: *
15* http://www.fsf.org/copyleft/gpl.html *
16* Please send any updates to: fred@gruntose.com *
17\*****************************************************************************/
18
19#ifdef __WIN32__
20
21#include "win32_security.h"
22
24#include <basis/astring.h>
25
26#include <comdef.h>
27#include <lm.h>
28
29// This piece of code is borrowed from the following July 1999 MSDN article
30// HOWTO: Look Up Current User Name and Domain Name, ID: Q155698
31//NOTE: It has been modified for inclusion here and it is Win32-specific.
32
33bool win32_security::GetUserAndDomainName(astring &UserName, astring &DomainName)
34{
35 HANDLE hToken;
36
37 // Initialize the return parameters.
38 UserName = "";
39 DomainName = "";
40
41 #define MY_BUFSIZE 512 // highly unlikely to exceed 512 bytes
42 UCHAR InfoBuffer[ MY_BUFSIZE + 1 ];
43 DWORD cbInfoBuffer = MY_BUFSIZE;
44 SID_NAME_USE snu;
45
46 BOOL bSuccess;
47
48 if(!OpenThreadToken(
49 GetCurrentThread(),
50 TOKEN_QUERY,
51 TRUE,
52 &hToken
53 )) {
54
55 if(GetLastError() == ERROR_NO_TOKEN) {
56
57 //
58 // attempt to open the process token, since no thread token
59 // exists
60 //
61
62 if(!OpenProcessToken(
63 GetCurrentProcess(),
64 TOKEN_QUERY,
65 &hToken
66 )) return FALSE;
67
68 } else {
69
70 //
71 // error trying to get thread token
72 //
73
74 return FALSE;
75 }
76 }
77
78 bSuccess = GetTokenInformation( hToken,
79 TokenUser,
80 InfoBuffer,
81 cbInfoBuffer,
82 &cbInfoBuffer);
83
84 if(!bSuccess) {
85 if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
86
87 //
88 // alloc buffer and try GetTokenInformation() again
89 //
90
91 CloseHandle(hToken);
92 return FALSE;
93
94 } else {
95
96 //
97 // error getting token info
98 //
99
100 CloseHandle(hToken);
101 return FALSE;
102 }
103 }
104
105 CloseHandle(hToken);
106
107 TCHAR User[MY_BUFSIZE + 1];;
108 DWORD cchUserName = MY_BUFSIZE;
109 TCHAR Domain[MY_BUFSIZE + 1];
110 DWORD cchDomainName = MY_BUFSIZE;
111
112 bSuccess = LookupAccountSid(NULL,
113 ((PTOKEN_USER)InfoBuffer)->User.Sid,
114 User,
115 &cchUserName,
116 Domain,
117 &cchDomainName,
118 &snu);
119
120 if (bSuccess)
121 {
122 UserName = from_unicode_temp(User);
123 DomainName = from_unicode_temp(Domain);
124 }
125
126 return bSuccess;
127}
128
129astring win32_security::full_user()
130{
131 astring user, temp_domain;
132 GetUserAndDomainName(user, temp_domain);
133 user += astring("[") + temp_domain + "]";
134 return user;
135}
136
137#endif // windows.
138
139
140
141
Support for unicode builds.
void * HANDLE
unsigned long DWORD