windows-nt/Source/XPSP1/NT/shell/ext/taskui/nusrmgr/nusrmgr.cpp
2020-09-26 16:20:57 +08:00

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;
}