#include <atlbase.h><br />#include <activeds.h><br />#include <stdio.h><br />#include <windows.h><br />#include <lm.h></p><p>#pragma comment(lib,"ActiveDS")<br />#pragma comment(lib,"adsiid")</p><p>int wmain(int argc, wchar_t *argv[])<br />{<br /> LPUSER_INFO_0 pBuf = NULL;<br /> LPUSER_INFO_0 pTmpBuf;<br /> DWORD dwLevel = 0;<br /> DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;<br /> DWORD dwEntriesRead = 0;<br /> DWORD dwTotalEntries = 0;<br /> DWORD dwResumeHandle = 0;<br /> DWORD i;<br /> DWORD dwTotalCount = 0;<br /> NET_API_STATUS nStatus;<br /> LPWSTR pszServerName = NULL;</p><p> if (argc > 2)<br /> {<br /> fwprintf(stderr, L"Usage: %s [////ServerName]/n", argv[0]);<br /> return 0;<br /> }<br /> // The server is not the default local computer.<br /> //<br /> if (argc == 2)<br /> pszServerName = argv[1];<br /> wprintf(L"/nUser account on %s: /n", pszServerName);</p><p> // 擷取關機許可權</p><p> // HANDLE hToken;<br /> // TOKEN_PRIVILEGES tkp;<br /> // //得到當前進程的令牌<br /> // OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES and TOKEN_QUERY,&hToken);<br /> // //得到關機特權的Luid<br /> // LookupPrivilegeValue(NULL,TEXT("SeShutdownPrivilege"),&tkp.Privileges[0].Luid);<br /> // //指定一次設定的特權屬性的個數<br /> // tkp.PrivilegeCount=1;<br /> // //雖然使用者可能有關機特權,但其狀態預設是disable的<br /> // tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;<br /> // AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0); </p><p> // 一下DEMO用於驗證登陸機制<br /> /* begin<br /> // 域使用者根據使用者名稱密碼登陸,擷取 SE_TCB_NAME許可權</p><p> HANDLE hdlTokenHandle ;<br /> TOKEN_PRIVILEGES tkp;<br /> HANDLE user; </p><p> OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hdlTokenHandle);<br /> LookupPrivilegeValue(NULL, SE_TCB_NAME, &tkp.Privileges[0].Luid);<br /> tkp.PrivilegeCount=1;<br /> tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; </p><p> if(AdjustTokenPrivileges(hdlTokenHandle, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0))<br /> {<br /> }</p><p> //wchar_t USER[256] = L"";<br /> //wchar_t PASS[256] = L"";<br /> LPCSTR USER("");<br /> LPCSTR PASS("");<br /> if (LogonUser( (LPSTR)USER,("a.com.cn"),(LPSTR)PASS,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&user))<br /> {<br /> printf("good"); </p><p> }<br /> else<br /> {<br /> printf("error");<br /> }<br /> */ // end</p><p> // GET DC NAME</p><p> LPBYTE bufptr = (LPBYTE)malloc(100*sizeof(WCHAR)); </p><p> NET_API_STATUS rt = NetGetDCName(NULL, pszServerName, &bufptr);<br /> int n = GetLastError();<br /> if(rt==NERR_Success)<br /> {<br /> wchar_t cc[512] ;<br /> swprintf((wchar_t *)cc, (L"/thell dc name ---- %s/n"), bufptr);<br /> OutputDebugStringW(cc);</p><p> }<br /> else if(rt==NERR_DCNotFound)<br /> { </p><p> }<br /> else if(rt==ERROR_INVALID_NAME)<br /> {<br /> } </p><p> do // begin do<br /> {</p><p> nStatus = NetUserEnum(pszServerName,<br /> dwLevel,<br /> FILTER_NORMAL_ACCOUNT, // global users<br /> (LPBYTE*)&pBuf,<br /> dwPrefMaxLen,<br /> &dwEntriesRead,<br /> &dwTotalEntries,<br /> &dwResumeHandle);<br /> //<br /> // If the call succeeds,<br /> //<br /> if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))<br /> {<br /> if ((pTmpBuf = pBuf) != NULL)<br /> {<br /> //<br /> // Loop through the entries.<br /> //<br /> for (i = 0; (i < dwEntriesRead); i++)<br /> {<br /> assert(pTmpBuf != NULL);</p><p> if (pTmpBuf == NULL)<br /> {<br /> fprintf(stderr, "An access violation has occurred/n");<br /> break;<br /> }<br /> //<br /> // Print the name of the user account.<br /> //</p><p> wprintf(L"/t-- %s/n", pTmpBuf->usri0_name);<br /> wchar_t cc[512] ;<br /> swprintf((wchar_t *)cc, (L"/thell ---- %s/n"), pTmpBuf->usri0_name);<br /> OutputDebugStringW(cc);</p><p> pTmpBuf++;<br /> dwTotalCount++;<br /> }<br /> }<br /> }<br /> //<br /> // Otherwise, print the system error.<br /> //<br /> else<br /> fprintf(stderr, "A system error has occurred: %d/n", nStatus);<br /> //<br /> // Free the allocated buffer.<br /> //<br /> if (pBuf != NULL)<br /> {<br /> NetApiBufferFree(pBuf);<br /> pBuf = NULL;<br /> }<br /> }<br /> // Continue to call NetUserEnum while<br /> // there are more entries.<br /> //<br /> while (nStatus == ERROR_MORE_DATA); // end do<br /> //<br /> // Check again for allocated memory.<br /> //<br /> if (pBuf != NULL)<br /> NetApiBufferFree(pBuf);<br /> //<br /> // Print the final count of users enumerated.<br /> //<br /> fprintf(stderr, "/nTotal of %d entries enumerated/n", dwTotalCount);</p><p> getchar();<br /> return 0;<br />}</p><p>