回答
可以检索与当前线程与GetUserName相关联的用户名:
// ANSI version
string GetWindowsUserNameA()
{
char buffer[UNLEN + 1] = {0};
DWORD buffer_len = UNLEN + 1;
if (!::GetUserNameA(buffer, & buffer_len))
{
// error handling
}
return string(buffer);
}
- Environment.UserName
这个问题指定了C++。除非OP愿意移动到C++/CLI,否则这没有帮助。 – ephemient 2009-10-20 18:10:23
退房微软对与Interix (also known as Services for UNIX 3.0)库移植建议。虽然你想要的东西过于夸张。
Windows的最接近一个UID当量为(可能是)一个SID。 GetUserName
,然后LookupAccountName
应该让你的用户的SID。
在Windows equivilent实际上是用户的SID。您可以通过使用“GetTokenInformation”调用并查询TokenUser信息类来获得此信息。
要调用GetTokenInformation,你需要一个句柄用户令牌,您可以通过调用OpenProcessToken(或OpenThreadToken如果你是假冒他人)获得。
我相信这会得到有关用于运行进程的SID的信息,所以它基本上等同于'geteuid()'而不是'getuid()'。 – 2009-10-20 14:30:56
合适的API是SHGetUID(),从壳牌
出口这是我想出了。
#include <stdint.h>
#include <stdlib.h>
#include <Windows.h>
#include <sddl.h>
#include <iostream>
#include <iomanip>
#include <memory>
struct heap_delete
{
typedef LPVOID pointer;
void operator()(LPVOID p)
{
::HeapFree(::GetProcessHeap(), 0, p);
}
};
typedef std::unique_ptr<LPVOID, heap_delete> heap_unique_ptr;
struct handle_delete
{
typedef HANDLE pointer;
void operator()(HANDLE p)
{
::CloseHandle(p);
}
};
typedef std::unique_ptr<HANDLE, handle_delete> handle_unique_ptr;
typedef uint32_t uid_t;
BOOL GetUserSID(HANDLE token, PSID* sid)
{
if (
token == nullptr || token == INVALID_HANDLE_VALUE
|| sid == nullptr
)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
DWORD tokenInformationLength = 0;
::GetTokenInformation(
token, TokenUser, nullptr, 0, &tokenInformationLength);
if(GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
return FALSE;
}
heap_unique_ptr data(
::HeapAlloc(
::GetProcessHeap(), HEAP_ZERO_MEMORY,
tokenInformationLength));
if (data.get() == nullptr)
{
return FALSE;
}
BOOL getTokenInfo = ::GetTokenInformation(
token, TokenUser, data.get(),
tokenInformationLength, &tokenInformationLength);
if (! getTokenInfo)
{
return FALSE;
}
PTOKEN_USER pTokenUser = (PTOKEN_USER)(data.get());
DWORD sidLength = ::GetLengthSid(pTokenUser->User.Sid);
heap_unique_ptr sidPtr(
::HeapAlloc(
GetProcessHeap(), HEAP_ZERO_MEMORY, sidLength));
PSID sidL = (PSID)(sidPtr.get());
if (sidL == nullptr)
{
return FALSE;
}
BOOL copySid = ::CopySid(sidLength, sidL, pTokenUser->User.Sid);
if (! copySid)
{
return FALSE;
}
if (!IsValidSid(sidL))
{
return FALSE;
}
*sid = sidL;
sidPtr.release();
return TRUE;
}
uid_t GetUID(HANDLE token)
{
PSID sid = nullptr;
BOOL getSID = GetUserSID(token, &sid);
if (! getSID || ! sid)
{
return -1;
}
heap_unique_ptr sidPtr((LPVOID)(sid));
LPWSTR stringSid = nullptr;
BOOL convertSid = ::ConvertSidToStringSidW(
sid, &stringSid);
if (! convertSid)
{
return -1;
}
uid_t ret = -1;
LPCWSTR p = ::wcsrchr(stringSid, L'-');
if (p && ::iswdigit(p[1]))
{
++p;
ret = ::_wtoi(p);
}
::LocalFree(stringSid);
return ret;
}
uid_t getuid()
{
HANDLE process = ::GetCurrentProcess();
handle_unique_ptr processPtr(process);
HANDLE token = nullptr;
BOOL openToken = ::OpenProcessToken(
process, TOKEN_READ|TOKEN_QUERY_SOURCE, &token);
if (! openToken)
{
return -1;
}
handle_unique_ptr tokenPtr(token);
uid_t ret = GetUID(token);
return ret;
}
uid_t geteuid()
{
HANDLE process = ::GetCurrentProcess();
HANDLE thread = ::GetCurrentThread();
HANDLE token = nullptr;
BOOL openToken = ::OpenThreadToken(
thread, TOKEN_READ|TOKEN_QUERY_SOURCE, FALSE, &token);
if (! openToken && ::GetLastError() == ERROR_NO_TOKEN)
{
openToken = ::OpenThreadToken(
thread, TOKEN_READ|TOKEN_QUERY_SOURCE, TRUE, &token);
if (! openToken && ::GetLastError() == ERROR_NO_TOKEN)
{
openToken = ::OpenProcessToken(
process, TOKEN_READ|TOKEN_QUERY_SOURCE, &token);
}
}
if (! openToken)
{
return -1;
}
handle_unique_ptr tokenPtr(token);
uid_t ret = GetUID(token);
return ret;
}
int main()
{
uid_t uid = getuid();
uid_t euid = geteuid();
std::cout
<< "uid: " << std::setbase(10) << uid << std::endl
<< "euid: " << std::setbase(10) << euid << std::endl
<< std::endl;
return EXIT_SUCCESS;
}
请注意,由Larry Osterman给出的答案是非常有帮助的。这让我开始了正确的方向。
- 1. opendir的Win32等价物
- 2. 什么是mac的win32等价物?
- 3. 什么是Process.MainModule.FileName的win32等价物
- 4. 的getuid根
- 5. 从.getUid()获取来自Firebase数据库的价值
- 6. 什么是在Win32 API中Posix popen()的等价物?
- 7. 等待的Win32线程
- 8. 等价的.send()
- 9. “单一实例应用”中的CreateMutex和COPYDATASTRUCT的Haskell Win32等价物?
- 10. C++等价的.split()
- 11. Python的等价物@
- 12. Python的等价性?
- 13. Prolog的等价算
- 14. os.getpardir()的等价物?
- 15. Fortran中的“等价”
- 16. Perl的等价PHP的compact()?
- 17. Ruby的cURL的等价物?
- 18. PostgreSQL的mysql_insert_id()的等价物?
- 19. Phoenix的Rails.env.production的等价物?
- 20. Ruby的等价的Python setattr()
- 21. simplexml_load_string等价的Python/Django的
- 22. CCLayer的-viewDidAppear的等价物?
- 23. VB6中的VLookup的等价
- 24. GridView的asp:HiddenField的等价性
- 25. MySQL的等价PHP的base_convert?
- 26. 的Linux等价的I_PUSH
- 27. 的JavaScript等价的PHP mktime
- 28. Ruby的等价ASP.NET的Application_Start?
- 29. 为什么我的getUID始终为空?
- 30. Win32 Mutex不等待
GetUserName()在Windows上运行的每一个版本,你不能相信在MSDN – Anders 2009-10-20 20:29:21
@Anders上市最少的版本,你是对的,我已经编辑,谢谢。 – KeatsPeeks 2009-10-20 21:11:00
@Anders你是否确实可以在Win32平台上工作? – user877329 2014-12-31 13:39:29