WindowsAPI : 有得到当前user 是否是 administrator的 API 函数吗? WindowsAPI : 有得到当前user 是否是 administrator的 API 函数吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先得到当前登陆用户(GetUserName),然后NetUserGetGroups判断是否是管理员组成员,就知道是否是管理员登录。 //转#include <windows.h>#include <stdio.h>#define ACCESS_READ 1#define ACCESS_WRITE 2void CChechIfAdministratorDlg::OnOK() { // TODO: Add extra validation here if (IsAdmin()) MessageBox("You are an administrator\n"); else MessageBox("You are not an administrator\n"); //CDialog::OnOK();}BOOL CChechIfAdministratorDlg::IsAdmin(){HANDLE hToken;DWORD dwStatus;DWORD dwAccessMask;DWORD dwAccessDesired;DWORD dwACLSize;DWORD dwStructureSize = sizeof(PRIVILEGE_SET);PACL pACL = NULL;PSID psidAdmin = NULL;BOOL bReturn = FALSE;PRIVILEGE_SET ps;GENERIC_MAPPING GenericMapping;PSECURITY_DESCRIPTOR psdAdmin = NULL;SID_IDENTIFIER_AUTHORITY SystemSidAuthority = SECURITY_NT_AUTHORITY;if(!ImpersonateSelf(SecurityImpersonation))goto LeaveIsAdmin;if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken)){if (GetLastError() != ERROR_NO_TOKEN)goto LeaveIsAdmin;if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))goto LeaveIsAdmin;if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))goto LeaveIsAdmin;}if (!AllocateAndInitializeSid(&SystemSidAuthority, 2,SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,0, 0, 0, 0, 0, 0, &psidAdmin))goto LeaveIsAdmin;psdAdmin = LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);if (psdAdmin == NULL)goto LeaveIsAdmin;if (!InitializeSecurityDescriptor(psdAdmin,SECURITY_DESCRIPTOR_REVISION))goto LeaveIsAdmin;dwACLSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) +GetLengthSid(psidAdmin) - sizeof(DWORD);pACL = (PACL)LocalAlloc(LPTR, dwACLSize);if (pACL == NULL)goto LeaveIsAdmin;if (!InitializeAcl(pACL, dwACLSize, ACL_REVISION2))goto LeaveIsAdmin;dwAccessMask= ACCESS_READ | ACCESS_WRITE;if (!AddAccessAllowedAce(pACL, ACL_REVISION2, dwAccessMask, psidAdmin))goto LeaveIsAdmin;if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE))goto LeaveIsAdmin;if(!SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE))goto LeaveIsAdmin;if(!SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE))goto LeaveIsAdmin;if (!IsValidSecurityDescriptor(psdAdmin))goto LeaveIsAdmin;dwAccessDesired = ACCESS_READ;GenericMapping.GenericRead = ACCESS_READ;GenericMapping.GenericWrite = ACCESS_WRITE;GenericMapping.GenericExecute = 0;GenericMapping.GenericAll = ACCESS_READ | ACCESS_WRITE;if (!AccessCheck(psdAdmin, hToken, dwAccessDesired,&GenericMapping, &ps, &dwStructureSize, &dwStatus, &bReturn))goto LeaveIsAdmin;if(!RevertToSelf())bReturn = FALSE;LeaveIsAdmin:if (pACL) LocalFree(pACL);if (psdAdmin) LocalFree(psdAdmin);if (psidAdmin) FreeSid(psidAdmin);return bReturn;} vs2005无法调试,断点失效 求帮忙!!!关于消息映射宏的问题!!! 关于vc操作excel宏的操作 如何判断当前的定时器timer正在运行? 关于MFC的框架,怎样得到全局的theApp的地址 急!请问如何实现图像文件的预览? 游戏作弊器的原理是什么? 我创建非模式对话框,但是上面的按钮都没有响应? MFC 非模态对话框调用 DES算法,有谁能帮助调试一下? 使用SQLConfigDataSource动态创建odbc数据源的问题。 请教 熟悉HTTP POST的朋友 up有分
#include <windows.h>
#include <stdio.h>#define ACCESS_READ 1
#define ACCESS_WRITE 2void CChechIfAdministratorDlg::OnOK()
{
// TODO: Add extra validation here
if (IsAdmin())
MessageBox("You are an administrator\n");
else
MessageBox("You are not an administrator\n");
//CDialog::OnOK();
}BOOL CChechIfAdministratorDlg::IsAdmin()
{
HANDLE hToken;
DWORD dwStatus;
DWORD dwAccessMask;
DWORD dwAccessDesired;
DWORD dwACLSize;
DWORD dwStructureSize = sizeof(PRIVILEGE_SET);
PACL pACL = NULL;
PSID psidAdmin = NULL;
BOOL bReturn = FALSE;
PRIVILEGE_SET ps;
GENERIC_MAPPING GenericMapping;
PSECURITY_DESCRIPTOR psdAdmin = NULL;
SID_IDENTIFIER_AUTHORITY SystemSidAuthority = SECURITY_NT_AUTHORITY;if(!ImpersonateSelf(SecurityImpersonation))
goto LeaveIsAdmin;if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken))
{
if (GetLastError() != ERROR_NO_TOKEN)
goto LeaveIsAdmin;if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
goto LeaveIsAdmin;if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
goto LeaveIsAdmin;
}if (!AllocateAndInitializeSid(&SystemSidAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, &psidAdmin))
goto LeaveIsAdmin;psdAdmin = LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (psdAdmin == NULL)
goto LeaveIsAdmin;if (!InitializeSecurityDescriptor(psdAdmin,
SECURITY_DESCRIPTOR_REVISION))
goto LeaveIsAdmin;dwACLSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) +
GetLengthSid(psidAdmin) - sizeof(DWORD);pACL = (PACL)LocalAlloc(LPTR, dwACLSize);
if (pACL == NULL)
goto LeaveIsAdmin;if (!InitializeAcl(pACL, dwACLSize, ACL_REVISION2))
goto LeaveIsAdmin;dwAccessMask= ACCESS_READ | ACCESS_WRITE;if (!AddAccessAllowedAce(pACL, ACL_REVISION2, dwAccessMask, psidAdmin))
goto LeaveIsAdmin;if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE))
goto LeaveIsAdmin;if(!SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE))
goto LeaveIsAdmin;
if(!SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE))
goto LeaveIsAdmin;if (!IsValidSecurityDescriptor(psdAdmin))
goto LeaveIsAdmin;dwAccessDesired = ACCESS_READ;GenericMapping.GenericRead = ACCESS_READ;
GenericMapping.GenericWrite = ACCESS_WRITE;
GenericMapping.GenericExecute = 0;
GenericMapping.GenericAll = ACCESS_READ | ACCESS_WRITE;if (!AccessCheck(psdAdmin, hToken, dwAccessDesired,
&GenericMapping, &ps, &dwStructureSize, &dwStatus, &bReturn))
goto LeaveIsAdmin;if(!RevertToSelf())
bReturn = FALSE;LeaveIsAdmin:if (pACL) LocalFree(pACL);
if (psdAdmin) LocalFree(psdAdmin);
if (psidAdmin) FreeSid(psidAdmin);return bReturn;
}