如何解决如何在C ++模拟到C#中获取HWID
在c#中使用此代码:
WindowsIdentity.GetCurrent()。User.Value;
并获得输出:
S-1-5-21-3050176684-2277112922-4090480026-1001
如何在c ++中获得相同的输出?
解决方法
以下是有关如何使用LookupAccountName
(Link to API)在本地计算机上获取帐户名称的SID的一些代码:
#include <windows.h>
#include <iostream>
#include <sddl.h>
LPCWSTR GetSid(LPCWSTR szAccountName)
{
LPWSTR pszRet = NULL;
DWORD dwDomainSize = 32,dwSidSize = 32;
LPWSTR pszDomainName = new WCHAR[dwDomainSize];
unsigned char* pSid = new unsigned char[dwSidSize];
while (true)
{
SID_NAME_USE sidType;
DWORD dwDomainSizeTmp = dwDomainSize,dwSidSizeTmp = dwSidSize;
if (LookupAccountNameW(NULL,szAccountName,(PSID)pSid,&dwSidSizeTmp,pszDomainName,&dwDomainSizeTmp,&sidType))
{
LPWSTR pszTmp;
if (ConvertSidToStringSidW(pSid,&pszTmp))
{
const int buffLen = wcslen(pszTmp) + 1;
pszRet = new WCHAR[buffLen];
wcscpy_s(pszRet,buffLen,pszTmp);
LocalFree(pszTmp);
}
break;
}
else
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (dwDomainSizeTmp > dwDomainSize)
{
delete[] pszDomainName;
pszDomainName = new WCHAR[dwDomainSizeTmp];
dwDomainSize = dwDomainSizeTmp;
}
if (dwSidSizeTmp > dwSidSize)
{
delete[] pSid;
pSid = new unsigned char[dwSidSizeTmp];
dwSidSize = dwSidSizeTmp;
}
}
else
{
break;
}
}
}
delete[] pszDomainName;
delete[] pSid;
return pszRet;
}
int main()
{
LPCWSTR ret = GetSid(L"andy");
if (ret)
{
std::wcout << L"SID for \"andy\" is: " << ret << std::endl;
delete[] ret;
}
else
{
std::wcout << L"Failed to get SID for \"andy\"" << std::endl;
}
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。