WindowsXP-SP1/admin/wizards/addgrpw/finish.cpp
2020-09-30 16:53:49 +02:00

542 lines
14 KiB
C++

// Finish.cpp : implementation file
//
#include "stdafx.h"
#include "Romaine.h"
#include "Finish.h"
#include "transbmp.h"
#include <lmcons.h>
#include <lmaccess.h>
#include <lmerr.h>
#include <lmapibuf.h>
#include <winnetwk.h>
#include <ntsecapi.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
NTSTATUS OpenPolicy(
LPWSTR ServerName, // machine to open policy on (Unicode)
DWORD DesiredAccess, // desired access to policy
PLSA_HANDLE PolicyHandle); // resultant policy handle
void InitLsaString(
PLSA_UNICODE_STRING LsaString, // destination
LPWSTR String); // source (Unicode)
#ifndef STATUS_SUCCESS
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#endif
/////////////////////////////////////////////////////////////////////////////
// CFinish property page
IMPLEMENT_DYNCREATE(CFinish, CPropertyPage)
CFinish::CFinish() : CPropertyPage(CFinish::IDD)
{
//{{AFX_DATA_INIT(CFinish)
m_csGroupType = _T("");
m_csGroupLocation = _T("");
m_csStaticText1 = _T("");
m_csStaticText2 = _T("");
//}}AFX_DATA_INIT
}
CFinish::~CFinish()
{
}
void CFinish::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFinish)
DDX_Text(pDX, IDC_GROUP_TYPE_STATIC, m_csGroupType);
DDX_Text(pDX, IDC_LOCATION_STATIC, m_csGroupLocation);
DDX_Text(pDX, IDC_STATIC1, m_csStaticText1);
DDX_Text(pDX, IDC_STATIC2, m_csStaticText2);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFinish, CPropertyPage)
//{{AFX_MSG_MAP(CFinish)
ON_WM_SHOWWINDOW()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFinish message handlers
BOOL CFinish::OnWizardFinish()
{
CRomaineApp* pApp = (CRomaineApp*)AfxGetApp();
CWaitCursor wait;
UINT uiMessage;
short sStatus = 0;
if (pApp->m_nGroupType == 0)
{
TCHAR* pServer = pApp->m_csServer.GetBuffer(pApp->m_csServer.GetLength());
pApp->m_csServer.ReleaseBuffer();
TCHAR* pGroupName = pApp->m_csGroupName.GetBuffer(pApp->m_csGroupName.GetLength());
pApp->m_csGroupName.ReleaseBuffer();
// create the global group
if (pApp->m_sMode == 0)
{
PGROUP_INFO_1 gi = (PGROUP_INFO_1)malloc(sizeof(GROUP_INFO_1));
gi->grpi1_name = pGroupName;
gi->grpi1_comment = pApp->m_csGroupDesc.GetBuffer(pApp->m_csGroupDesc.GetLength());
pApp->m_csGroupDesc.ReleaseBuffer();
DWORD dwErr = NetGroupAdd(pServer,
1, (LPBYTE)gi, NULL);
free(gi);
if (dwErr == 2223)
{
AfxMessageBox(IDS_GROUP_EXISTS);
pApp->m_cps1.SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
pApp->m_cps1.SetActivePage(1);
return FALSE;
}
else if (dwErr == 5)
{
AfxMessageBox(IDS_INSUFFICIENT_PERMISSION);
pApp->m_cps1.SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
pApp->m_cps1.SetActivePage(2);
return FALSE;
}
else if ((dwErr == 1379) || (dwErr == NERR_GroupExists))
{
AfxMessageBox(IDS_GROUP_EXISTS);
pApp->m_cps1.SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
pApp->m_cps1.SetActivePage(1);
return FALSE;
}
else if (dwErr != NERR_Success)
{
AfxMessageBox(IDS_UNKNOWN_ERROR);
return CPropertyPage::OnWizardFinish();
}
}
// build the array of users
POSITION pos;
CString csName;
short sCount = pApp->m_csaNames.GetCount();
GROUP_USERS_INFO_0* pUsers = (GROUP_USERS_INFO_0*)malloc(sCount * sizeof(GROUP_USERS_INFO_0));
GROUP_USERS_INFO_0* ppUsers = pUsers;
for (pos = pApp->m_csaNames.GetHeadPosition(); pos != NULL;)
{
csName = pApp->m_csaNames.GetNext(pos);
TCHAR* pName = (TCHAR*)csName.GetBuffer(csName.GetLength());
csName.ReleaseBuffer();
pUsers->grui0_name = (LPTSTR)GlobalAlloc(GPTR, (csName.GetLength() + 1) * sizeof(TCHAR));
_tcscpy(pUsers->grui0_name, pName);
pUsers++;
}
DWORD dwErr = NetGroupSetUsers(pServer,
pGroupName,
0,
(BYTE*)ppUsers,
sCount);
if (dwErr == NERR_Success) sStatus = 0; // success
else sStatus = 1; //failure
void* pTemp = ppUsers;
// clean up names buffer
while (sCount > 0)
{
GlobalFree((HGLOBAL)ppUsers->grui0_name);
ppUsers++;
sCount--;
}
free(pTemp);
}
else
{
TCHAR* pServer = pApp->m_csServer.GetBuffer(pApp->m_csServer.GetLength());
pApp->m_csServer.ReleaseBuffer();
TCHAR* pGroupName = pApp->m_csGroupName.GetBuffer(pApp->m_csGroupName.GetLength());
pApp->m_csGroupName.ReleaseBuffer();
// create the local group
if (pApp->m_sMode == 0)
{
PLOCALGROUP_INFO_1 gi = (PLOCALGROUP_INFO_1)malloc(sizeof(LOCALGROUP_INFO_1));
gi->lgrpi1_name = pGroupName;
gi->lgrpi1_comment = pApp->m_csGroupDesc.GetBuffer(pApp->m_csGroupDesc.GetLength());
DWORD dwErr = NetLocalGroupAdd(pServer,
1, (LPBYTE)gi, NULL);
pApp->m_csGroupDesc.ReleaseBuffer();
free(gi);
if ((dwErr == 1379) || (dwErr == 2223))
{
AfxMessageBox(IDS_GROUP_EXISTS);
pApp->m_cps1.SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
pApp->m_cps1.SetActivePage(1);
return FALSE;
}
else if (dwErr == 5)
{
AfxMessageBox(IDS_INSUFFICIENT_PERMISSION);
pApp->m_cps1.SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
pApp->m_cps1.SetActivePage(2);
return FALSE;
}
else if (dwErr != NERR_Success)
{
AfxMessageBox(IDS_UNKNOWN_ERROR);
return CPropertyPage::OnWizardFinish();
}
}
short sCount = pApp->m_csaNames.GetCount();
LOCALGROUP_MEMBERS_INFO_0* pMembers = (LOCALGROUP_MEMBERS_INFO_0*)malloc(sCount * sizeof(LOCALGROUP_MEMBERS_INFO_0));
LOCALGROUP_MEMBERS_INFO_0* ppMembers = pMembers;
// go through the user list and get a SID for each member
POSITION pos;
CString csName;
USHORT uCount = 0;
for (pos = pApp->m_csaNames.GetHeadPosition(); pos != NULL;)
{
CString csName = pApp->m_csaNames.GetNext(pos);
CString csNameLocation = csName.Left(csName.Find(L"\\"));
// if the account comes from a domain, we need a DC name
if ((csNameLocation != (pApp->m_csCurrentMachine.Right(pApp->m_csCurrentMachine.GetLength() - 2))) &&
(csNameLocation != (pApp->m_csServer.Right(pApp->m_csServer.GetLength() - 2))))
{
TCHAR* pDCName;
NET_API_STATUS nAPI = NetGetDCName(NULL,
csNameLocation.GetBuffer(csNameLocation.GetLength()),
(LPBYTE*)&pDCName);
csNameLocation.ReleaseBuffer();
csNameLocation = pDCName;
NetApiBufferFree(pDCName);
if (nAPI != ERROR_SUCCESS)
{
AfxMessageBox(IDS_CANT_ADDNAME);
continue;
}
}
else csNameLocation = pApp->m_csCurrentMachine;
csName = csName.Right(csName.GetLength() - (csName.Find(L"\\") + 1));
TCHAR* pNameLocation = csNameLocation.GetBuffer(csNameLocation.GetLength());
csNameLocation.ReleaseBuffer();
DWORD sidSize = 0;
DWORD strSize = 80;
TCHAR str[80];
SID_NAME_USE sidType;
DWORD ret = LookupAccountName(pNameLocation, (LPCTSTR)csName, NULL, &sidSize, str, &strSize, &sidType);
pMembers->lgrmi0_sid = (PSID)GlobalAlloc(GPTR, sidSize);
strSize = 80;
ret=LookupAccountName(pNameLocation, (LPCTSTR)csName, pMembers->lgrmi0_sid, &sidSize, str, &strSize, &sidType);
pMembers++;
uCount++;
}
DWORD err = NetLocalGroupSetMembers(pServer,
pGroupName,
0,
(LPBYTE)ppMembers,
sCount);
if (err == NERR_Success) uiMessage = IDS_SUCCESS;
else if ((err == NERR_GroupExists) || (err == 1376) || (err == 1379))
{
AfxMessageBox(IDS_GROUP_EXISTS);
pApp->m_cps1.SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
pApp->m_cps1.SetActivePage(1);
return FALSE;
}
else if (err == 2220) sStatus = 1;
else sStatus = 1;
#ifdef _DEBUG
TCHAR tErr[20];
swprintf(tErr, L"Error = %d\n\r", err);
TRACE(tErr);
#endif
pApp->m_csGroupName.ReleaseBuffer();
pApp->m_csServer.ReleaseBuffer();
void* pTemp = ppMembers;
// clean up names buffer
while (uCount > 0)
{
GlobalFree(ppMembers->lgrmi0_sid);
ppMembers++;
uCount--;
}
free(pTemp);
}
if (pApp->m_csCmdLine != L"") //cmdline - no restart
{
if (pApp->m_sMode == 0)//create new
{
if (sStatus == 0) uiMessage = IDS_SUCCESS;
else uiMessage = IDS_CANT_ADD_NAMES;
}
else // modify
{
if (sStatus == 0) uiMessage = IDS_SUCCESS;
else uiMessage = IDS_CANT_ADD_NAMES;
}
AfxMessageBox(uiMessage);
return CPropertyPage::OnWizardFinish();
}
else
{
if (pApp->m_sMode == 0)//create new
{
if (sStatus == 0)
{
// clear out old values
pApp->m_csGroupName = L"";
pApp->m_csGroupDesc = L"";
uiMessage = IDS_SUCCESS_CREATE_RETRY;
}
else uiMessage = IDS_CANT_ADD_NAMES_CREATE_RETRY;
}
else // modify
{
if (sStatus == 0)
{
// clear out old values
pApp->m_csGroupName = L"";
pApp->m_csGroupDesc = L"";
uiMessage = IDS_SUCCESS_MODIFY_RETRY;
}
else uiMessage = IDS_CANT_ADD_NAMES_MODIFY_RETRY;
}
if (AfxMessageBox(uiMessage, MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
{
// clear out old info
pApp->m_csaNames.RemoveAll();
pApp->bRestart1 = TRUE;
pApp->bRestart2 = TRUE;
pApp->m_cps1.SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
pApp->m_cps1.SetActivePage(1);
return FALSE;
}
}
return CPropertyPage::OnWizardFinish();
}
void InitLsaString(PLSA_UNICODE_STRING LsaString, LPWSTR String)
{
DWORD StringLength;
if (String == NULL)
{
LsaString->Buffer = NULL;
LsaString->Length = 0;
LsaString->MaximumLength = 0;
return;
}
StringLength = wcslen(String);
LsaString->Buffer = String;
LsaString->Length = (USHORT) StringLength * sizeof(WCHAR);
LsaString->MaximumLength=(USHORT)(StringLength+1) * sizeof(WCHAR);
}
NTSTATUS OpenPolicy(LPWSTR ServerName, DWORD DesiredAccess, PLSA_HANDLE PolicyHandle)
{
LSA_OBJECT_ATTRIBUTES ObjectAttributes;
LSA_UNICODE_STRING ServerString;
PLSA_UNICODE_STRING Server = NULL;
//
// Always initialize the object attributes to all zeroes.
//
ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
if (ServerName != NULL)
{
//
// Make a LSA_UNICODE_STRING out of the LPWSTR passed in
//
InitLsaString(&ServerString, ServerName);
Server = &ServerString;
}
//
// Attempt to open the policy.
//
return LsaOpenPolicy(
Server,
&ObjectAttributes,
DesiredAccess,
PolicyHandle);
}
void CFinish::OnShowWindow(BOOL bShow, UINT nStatus)
{
CPropertyPage::OnShowWindow(bShow, nStatus);
CRomaineApp* pApp = (CRomaineApp*)AfxGetApp();
if (bShow)
{
if (pApp->m_nGroupType == 1)
m_csGroupType.LoadString(IDS_LOCAL_GROUP);
else
m_csGroupType.LoadString(IDS_GLOBAL_GROUP);
m_csGroupType += pApp->m_csGroupName;
if (pApp->m_bDomain)
m_csGroupLocation = pApp->m_csDomain;
else
m_csGroupLocation = pApp->m_csServer;
if (pApp->m_sMode == 1)
{
m_csStaticText1.LoadString(IDS_MODIFY_TEXT);
m_csStaticText2.LoadString(IDS_MODIFY_TEXT2);
}
else
{
m_csStaticText1.LoadString(IDS_CREATE_TEXT);
m_csStaticText2.LoadString(IDS_CREATE_TEXT2);
}
UpdateData(FALSE);
}
}
void CFinish::OnPaint()
{
CPaintDC dc(this); // device context for painting
CTransBmp* pBitmap = new CTransBmp;
pBitmap->LoadBitmap(IDB_END_FLAG);
pBitmap->DrawTrans(&dc, 0,0);
delete pBitmap;
}
LRESULT CFinish::OnWizardBack()
{
CRomaineApp* pApp = (CRomaineApp*)AfxGetApp();
pApp->m_cps1.SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
if (pApp->m_nGroupType == 0) return IDD_GLOBAL_USERS;
else return IDD_LOCAL_USERS;
}
// im using the LSA functions as the std LookupAccountName doesn't work on Local Users
/*
LSA_HANDLE Policy_Handle;
NTSTATUS Status;
LPTSTR lpServer = pApp->m_csServer.GetBuffer(pApp->m_csServer.GetLength());
Status = OpenPolicy(lpServer, POLICY_LOOKUP_NAMES, &Policy_Handle);
// Did OpenPolicy work?
if (Status != STATUS_SUCCESS)
{
AfxMessageBox(IDS_CANT_ADD_NAMES);
pApp->m_csServer.ReleaseBuffer();
return CPropertyPage::OnWizardFinish();
}
POSITION pos;
CString csName;
LPWSTR lpName;
USHORT uCount = 0;
LSA_UNICODE_STRING lusName;
PLSA_UNICODE_STRING plusName = NULL;
BYTE domainbuffer[1000];
PLSA_REFERENCED_DOMAIN_LIST lsarDomainList = (PLSA_REFERENCED_DOMAIN_LIST)&domainbuffer;
BYTE sidbuffer[100];
PLSA_TRANSLATED_SID lsatSID = (PLSA_TRANSLATED_SID)&sidbuffer;
for (pos = pApp->m_csaNames.GetHeadPosition(); pos != NULL;)
{
csName = pApp->m_csaNames.GetNext(pos);
lpName = csName.GetBuffer(csName.GetLength());
InitLsaString(&lusName, lpName); // Make a LSA_UNICODE_STRING out of the LPWSTR passed in
plusName = &lusName;
Status = LsaLookupNames(Policy_Handle,
1, // count
plusName, // LSA_UNICODE_STRING
&lsarDomainList,
&lsatSID);
ULONG uErr = LsaNtStatusToWinError(Status);
if (!uErr) // success
{
NetLocalGroupAddMember(lpServer,
pApp->m_csGroupName.GetBuffer(pApp->m_csGroupName.GetLength()),
}
csName.ReleaseBuffer();
}
pApp->m_csServer.ReleaseBuffer();
*/
/* BYTE sidbuffer[100];
PSID pSID = (PSID)&sidbuffer;
DWORD cbSID = 100;
TCHAR domainBuffer[80];
DWORD domainBufferSize = 80;
SID_NAME_USE snu;
BOOL bRet = LookupAccountName((const TCHAR*)pApp->m_csServer,
L"Guest",
pSID,
&cbSID,
domainBuffer,
&domainBufferSize,
&snu);
TRACE(L"blob"); */