223 lines
6 KiB
C++
223 lines
6 KiB
C++
// nusrmgr.cpp : Implementation of WinMain
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include <initguid.h>
|
|
#include "nusrmgr.h"
|
|
#include "nusrmgr_i.c"
|
|
|
|
#include <lmaccess.h> // for NetUserModalsGet
|
|
#include <lmapibuf.h> // for NetApiBufferFree
|
|
#include <lmerr.h> // for NERR_Success
|
|
|
|
#include "PageFact.h"
|
|
#include "MainPage.h"
|
|
//#include "UserPage.h"
|
|
//#include "LogonPage.h"
|
|
|
|
WCHAR g_szAdminName[MAX_PATH];
|
|
WCHAR g_szGuestName[MAX_PATH];
|
|
|
|
CComModule _Module;
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
//OBJECT_ENTRY(CLSID_MainPage, CMainPage)
|
|
//OBJECT_ENTRY(CLSID_UserPage, CUserPage)
|
|
//OBJECT_ENTRY(CLSID_LogonPage, CLogonPage)
|
|
END_OBJECT_MAP()
|
|
|
|
|
|
DWORD BuildAccountSidFromRid(LPCWSTR pszServer, DWORD dwRid, PSID* ppSid)
|
|
{
|
|
DWORD dwErr = ERROR_SUCCESS;
|
|
PUSER_MODALS_INFO_2 umi2;
|
|
NET_API_STATUS nasRet;
|
|
|
|
*ppSid = NULL;
|
|
|
|
// Get the account domain Sid on the target machine
|
|
nasRet = NetUserModalsGet(pszServer, 2, (LPBYTE*)&umi2);
|
|
|
|
if ( nasRet == NERR_Success )
|
|
{
|
|
UCHAR cSubAuthorities;
|
|
PSID pSid;
|
|
|
|
cSubAuthorities = *GetSidSubAuthorityCount(umi2->usrmod2_domain_id);
|
|
|
|
// Allocate storage for new the Sid (domain Sid + account Rid)
|
|
pSid = (PSID)LocalAlloc(LPTR, GetSidLengthRequired((UCHAR)(cSubAuthorities+1)));
|
|
|
|
if ( pSid != NULL )
|
|
{
|
|
if ( InitializeSid(pSid,
|
|
GetSidIdentifierAuthority(umi2->usrmod2_domain_id),
|
|
(BYTE)(cSubAuthorities+1)) )
|
|
{
|
|
// Copy existing subauthorities from domain Sid to new Sid
|
|
for (UINT i = 0; i < cSubAuthorities; i++)
|
|
{
|
|
*GetSidSubAuthority(pSid, i) = *GetSidSubAuthority(umi2->usrmod2_domain_id, i);
|
|
}
|
|
|
|
// Append Rid to new Sid
|
|
*GetSidSubAuthority(pSid, cSubAuthorities) = dwRid;
|
|
|
|
*ppSid = pSid;
|
|
}
|
|
else
|
|
{
|
|
dwErr = GetLastError();
|
|
LocalFree(pSid);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwErr = GetLastError();
|
|
}
|
|
|
|
NetApiBufferFree(umi2);
|
|
}
|
|
else
|
|
{
|
|
dwErr = nasRet;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
BOOL GetAccountNameFromRid(LPCWSTR pszServer, DWORD dwRid, LPWSTR pszName, DWORD cchName)
|
|
{
|
|
BOOL bResult = FALSE;
|
|
PSID pSid;
|
|
|
|
pszName[0] = L'\0';
|
|
|
|
if (NOERROR == BuildAccountSidFromRid(pszServer, dwRid, &pSid))
|
|
{
|
|
WCHAR szDomain[DNLEN+1];
|
|
DWORD cchDomain = ARRAYSIZE(szDomain);
|
|
SID_NAME_USE snu;
|
|
|
|
bResult = LookupAccountSidW(pszServer, pSid, pszName, &cchName, szDomain, &cchDomain, &snu);
|
|
|
|
LocalFree(pSid);
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
HRESULT ShowUserAccounts()
|
|
{
|
|
HRESULT hr;
|
|
|
|
CComPtr<ITaskSheet> spTaskSheet;
|
|
hr = spTaskSheet.CoCreateInstance(__uuidof(TaskSheet));
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CComPtr<IPropertyBag> spProps = NULL;
|
|
|
|
hr = spTaskSheet->GetPropertyBag(IID_IPropertyBag, (void**)&spProps);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
WCHAR szTitle[MAX_PATH];
|
|
LoadStringW(_Module.GetResourceInstance(), IDS_UA_TITLE, szTitle, ARRAYSIZE(szTitle));
|
|
|
|
CComVariant var(szTitle);
|
|
spProps->Write(TS_PROP_TITLE, &var);
|
|
|
|
var = 750;
|
|
spProps->Write(TS_PROP_WIDTH, &var);
|
|
|
|
var = 500;
|
|
spProps->Write(TS_PROP_HEIGHT, &var);
|
|
|
|
var = 600;
|
|
spProps->Write(TS_PROP_MINWIDTH, &var);
|
|
|
|
var = 400;
|
|
spProps->Write(TS_PROP_MINHEIGHT, &var);
|
|
|
|
LPWSTR pszTemp = FormatString(L"res://nusrmgr.exe/%d/%d", RT_BITMAP, IDB_WATERMARK);
|
|
if (NULL != pszTemp)
|
|
{
|
|
var = pszTemp;
|
|
spProps->Write(TS_PROP_WATERMARK, &var);
|
|
LocalFree(pszTemp);
|
|
}
|
|
|
|
var = false;
|
|
spProps->Write(TS_PROP_MODELESS, &var);
|
|
spProps->Write(TS_PROP_STATUSBAR, &var);
|
|
|
|
var = true;
|
|
spProps->Write(TS_PROP_RESIZABLE, &var);
|
|
|
|
//try
|
|
//{
|
|
// var oThemeManager = new ActiveXObject("Theme.Manager");
|
|
// css = objThemeManger.WebviewCSS;
|
|
//}
|
|
//catch (e)
|
|
//{
|
|
// css = "res://webvw.dll/cpwebvw.css";
|
|
//}
|
|
var = L"res://webvw.dll/cpwebvw.css";
|
|
spProps->Write(UA_PROP_CSSPATH, &var);
|
|
|
|
CComPtr<ILogonEnumUsers> spUserList;
|
|
hr = spUserList.CoCreateInstance(CLSID_ShellLogonEnumUsers);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
var = (IUnknown*)spUserList;
|
|
spProps->Write(UA_PROP_USERLIST, &var);
|
|
|
|
CComPtr<ITaskPageFactory> spPageFactory;
|
|
hr = CPageFactory::CreateInstance(&spPageFactory);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = spTaskSheet->Run(spPageFactory, CLSID_MainPage, NULL);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
extern "C" int WINAPI WinMain(HINSTANCE hInstance,
|
|
HINSTANCE /*hPrevInstance*/,
|
|
LPSTR /*lpCmdLine*/,
|
|
int /*nShowCmd*/)
|
|
{
|
|
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
|
|
HRESULT hrCom = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
#else
|
|
HRESULT hrCom = CoInitialize(NULL);
|
|
#endif
|
|
|
|
_Module.Init(ObjectMap, hInstance);
|
|
_Module.RegisterTypeLib();
|
|
|
|
if (!GetAccountNameFromRid(NULL, DOMAIN_USER_RID_ADMIN, g_szAdminName, ARRAYSIZE(g_szAdminName)))
|
|
LoadStringW(hInstance, IDS_ADMINNAME, g_szAdminName, ARRAYSIZE(g_szAdminName));
|
|
|
|
if (!GetAccountNameFromRid(NULL, DOMAIN_USER_RID_GUEST, g_szGuestName, ARRAYSIZE(g_szGuestName)))
|
|
LoadStringW(hInstance, IDS_GUESTNAME, g_szGuestName, ARRAYSIZE(g_szGuestName));
|
|
|
|
ShowUserAccounts();
|
|
|
|
_Module.Term();
|
|
|
|
if (SUCCEEDED(hrCom))
|
|
CoUninitialize();
|
|
|
|
return 0;
|
|
}
|