微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在C ++中获取使用我的服务的用户的SID和用户名

我正在尝试创build一个基本上充当本地Web服务器的服务。 理论上,用户将通过在浏览器中通过本地主机访问URI来使用REST API,即http:// localhost:2017 / path / to / function / call将连接到服务并执行一个function。

我的问题是如何获得调用该服务的帐户的SID和用户名

我已经实现了几个解决scheme,但是他们返回服务的SID和用户名,而不是使用它的用户

OJSon* UnifiedStreamingService::getUserDetails() { OJSon* result = OJSon::create(); if(result) { /* HANDLE hToken = NULL; ULONG id = WTSGetActiveConsoleSessionId(); BOOL bRet = WTSQueryUserToken(id,&hToken); if (bRet == false) { DWORD error = GetLastError(); printf("ERROR: %d",error); } */ HANDLE hToken = NULL; if ( ! OpenProcesstoken( GetCurrentProcess(),TOKEN_QUERY,&hToken ) ) { //_tprintf( _T("OpenProcesstoken Failed. GetLastError returned: %dn"),GetLastError()); return NULL; } // Get the size of the memory buffer needed for the SID DWORD dwBufferSize = 0; if ( ! GetTokeninformation( hToken,TokenUser,NULL,&dwBufferSize ) && ( GetLastError() != ERROR_INSUFFICIENT_BUFFER ) ) { //_tprintf( _T("GetTokeninformation Failed. GetLastError returned: %dn"),GetLastError()); // Cleanup CloseHandle( hToken ); hToken = NULL; return NULL; } // Allocate buffer for user token data std::vector<BYTE> buffer; buffer.resize( dwBufferSize ); PTOKEN_USER pTokenUser = reinterpret_cast<PTOKEN_USER>( &buffer[0] ); // Retrieve the token information in a TOKEN_USER structure if ( ! GetTokeninformation( hToken,pTokenUser,dwBufferSize,&dwBufferSize)) { //_tprintf( _T("2 GetTokeninformation Failed. GetLastError returned: %dn"),GetLastError()); // Cleanup CloseHandle( hToken ); hToken = NULL; return NULL; } // Check if SID is valid if ( ! IsValidSid( pTokenUser->User.Sid ) ) { //_tprintf( _T("The owner SID is invalid.n") ); // Cleanup CloseHandle(hToken); hToken = NULL; return NULL; } // add the name OString* name = lookupAccountSid(pTokenUser->User.Sid); if(name) { result->setKey(&OString("name"),name); SAFEDELETE(name); } // add the SID OString* sid = convertSidToString(pTokenUser->User.Sid); if(sid) { result->setKey(&OString("SID"),sid); SAFEDELETE(sid); } // Cleanup CloseHandle(hToken); hToken = NULL; } return result; } OString* UnifiedStreamingService::convertSidToString(PSID pSID) { OString* result = NULL; if(pSID) { // Get string corresponding to SID LPTSTR pszSID = NULL; if ( ! ConvertSidToStringSid( pSID,&pszSID ) ) { return NULL; } result = new OString(pszSID); // Release buffer allocated by ConvertSidToStringSid API LocalFree( pszSID ); pszSID = NULL; } return result; } OString* UnifiedStreamingService::lookupAccountSid(PSID pSID) { DWORD dwSize = 256; DWORD dwResult = 0; SID_NAME_USE SidType; LPTSTR lpName = new TCHAR[dwSize]; LPWSTR lpDomain = new TCHAR[dwSize]; OString* result = NULL; if( !LookupAccountSid( NULL,pSID,lpName,&dwSize,lpDomain,&SidType ) ) { dwResult = GetLastError(); return NULL; } OString* pDomain = new OString(lpDomain); OString* pName = new OString(lpName); if(pDomain && pName) { result = OString::createByFormat(&OString("%s\%s"),pDomain,pName); SAFEDELETE(pDomain); SAFEDELETE(pName); } delete[] lpDomain; delete[] lpName; return result; }

我可以在Python中使用库抽象吗?

必须在Windows 7上运行ruby脚本,并获得权限拒绝EACCES

Windows的C ++事件跟踪(ETW)包装器

如何在C#中的文本文件中设置string

在Windows上执行Linux操作的Java / C#.NET

何时Windows服务可执行文件卸载?

显示窗体时,Windows Vista和7动作效果只应用一次。 为什么?

PHP例子中编写windows应用程序

Windows HOME – SHGet(已知)FolderPath

设置多个壁纸?

该任务可以通过使用WTSGetActiveConsoleSessionId和WTSQueryUserToken获取用户令牌,然后通过GetTokeninformation获取SID来完成。 额外的要求是服务在授予SE_TCB_NAME权限的本地系统帐户下运行(== SeTcbPrivilege)。 由WTSQueryUserToken所需的SE_TCB_NAME。 请注意,其他帐户通常没有SE_TCB_NAME的权限!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐