Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [С++ Builder 2009] Проблемы с созданием пользователей (наверно все дело в строках)

Ответить
Настройки темы
C/C++ - [С++ Builder 2009] Проблемы с созданием пользователей (наверно все дело в строках)

Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25


Конфигурация

Профиль | Отправить PM | Цитировать


Вот есть код:
Код: Выделить весь код
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Ntsecapi.h"
#include "shlwapi.h"
#include "lm.h"
#include "cstdlib"
#include "tchar.h"
#include "stdlib.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
DWORD  CreateNewUser(wchar_t *UserName, wchar_t *UserPass, wchar_t *UserDesc, wchar_t *UserGroup, bool IsAutoLogon);
LONG   SetDefaultPassword(LPCWSTR PasswordBuffer);
LONG   SetAutoLogon(LPCWSTR pszUserName, LPCWSTR pszPassword);
void   ClearAutoLogon(VOID);
void   SetDefAccount(LPCWSTR pszUser, LPCWSTR pszDomain);
void   MyRtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString);
WCHAR* GetGroupName(WCHAR* pszAdmins, DWORD cchAdmins, DWORD Group_Rid);
void   GetDefAccount(LPCWSTR pszUser, DWORD cbUser);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// registry information
const WCHAR c_szWinLogon[]          = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\WinLogon";
const WCHAR c_szAutoLogon[]         = L"AutoAdminLogon";
const WCHAR c_szDefUserName[]       = L"DefaultUserName";
const WCHAR c_szDefDomain[]         = L"DefaultDomainName";
const WCHAR c_szDefPassword[]       = L"DefaultPassword";
const WCHAR c_szDefaultPwdKey[]     = L"DefaultPassword";

///////////////////////////////////////////////////////////////

DWORD CreateNewUser(wchar_t *UserName, wchar_t *UserPass, wchar_t *UserDesc, wchar_t *UserGroup, bool IsAutoLogon)
{
PWCHAR         pDomainName;
PSID           pUserSID;
DWORD          nStatus;
SID_NAME_USE   snu;
USER_INFO_1    UI;
DWORD          IndxErrorFild = 0;
DWORD          sid_size = 0;
DWORD          domain_size = 0;

UI.usri1_name			= UserName;
UI.usri1_password		= UserPass;
UI.usri1_comment		= UserDesc;
UI.usri1_priv			= USER_PRIV_USER;
UI.usri1_flags			= UF_SCRIPT | UF_NORMAL_ACCOUNT | UF_DONT_EXPIRE_PASSWD;
UI.usri1_password_age	= NULL;
UI.usri1_home_dir		= L"";
UI.usri1_script_path	= NULL;

nStatus = NetUserAdd(NULL, 1, (LPBYTE)&UI, &IndxErrorFild);
if(nStatus != NERR_Success) return nStatus;

LookupAccountNameW(NULL, UserName, NULL, &sid_size, NULL, &domain_size, &snu);

if((pDomainName = (PWCHAR)malloc(2*(domain_size+1))) == NULL)
{
	return -1;
}

if((pUserSID = (PSID)malloc(sid_size)) == NULL)
{
	if(pDomainName) free(pDomainName);
	return -1;
}

if(LookupAccountNameW(NULL, UserName, pUserSID, &sid_size, pDomainName, &domain_size, &snu))
{
	LOCALGROUP_MEMBERS_INFO_0 lmi0 = {pUserSID};
	nStatus = NetLocalGroupAddMembers(NULL, UserGroup, 0, (LPBYTE)&lmi0, 1);

	if((IsAutoLogon)&&(NERR_Success == nStatus)) nStatus = SetAutoLogon(UserName, UserPass);
}

if(pDomainName) free(pDomainName);
if(pUserSID)    free(pUserSID);

return nStatus;
}

////////////////////////////////////////////////////////////

BOOL _RegSetSZ(HKEY hk, LPCWSTR pszValueName, LPCWSTR pszValue)
{
	DWORD dwSize = lstrlenW(pszValue)*sizeof(WCHAR);
    return ERROR_SUCCESS == RegSetValueExW(hk, pszValueName, 0x0, REG_SZ, (BYTE *)pszValue, dwSize);
}

BOOL _RegSetDWORD(HKEY hk, LPCWSTR pszValueName, DWORD dwValue)
{
	DWORD dwSize = sizeof(dwValue);
    return ERROR_SUCCESS == RegSetValueExW(hk, pszValueName, 0x0, REG_DWORD, (BYTE *)&dwValue, dwSize);
}

BOOL _RegDelValue(HKEY hk, LPCWSTR pszValueName)
{
	return ERROR_SUCCESS == RegDeleteValueW(hk, pszValueName);
}

///////////////////////////////////////////////////////////////

LONG SetDefaultPassword(LPCWSTR PasswordBuffer)
{
	LONG Status;
	LSA_OBJECT_ATTRIBUTES ObjectAttributes;
    LSA_HANDLE LsaHandle = NULL;
	LSA_UNICODE_STRING SecretName;
    LSA_UNICODE_STRING SecretValue;

	ObjectAttributes.Attributes = NULL;
	ObjectAttributes.Length = sizeof(LSA_OBJECT_ATTRIBUTES);
	ObjectAttributes.ObjectName = NULL;
	ObjectAttributes.RootDirectory = NULL;
	ObjectAttributes.SecurityDescriptor = NULL;
	ObjectAttributes.SecurityQualityOfService = NULL;


	Status = LsaOpenPolicy(NULL, &ObjectAttributes, POLICY_CREATE_SECRET, &LsaHandle);
    if(Status != 0) return Status;

	MyRtlInitUnicodeString(&SecretName, c_szDefaultPwdKey);
	MyRtlInitUnicodeString(&SecretValue, PasswordBuffer);

    Status = LsaStorePrivateData(LsaHandle, &SecretName, &SecretValue);
    LsaClose(LsaHandle);

	return Status;
}

///////////////////////////////////////////////////////////////
// Clear the auto admin logon
///////////////////////////////////////////////////////////////
void ClearAutoLogon(VOID)
{
    HKEY hk;
    if(ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, c_szWinLogon, 0x0, KEY_WRITE, &hk))
    {
        _RegSetSZ(hk, c_szAutoLogon, L"0");
		_RegDelValue(hk, c_szDefPassword);
        RegCloseKey(hk);
    }

    SetDefaultPassword(L"");
}

///////////////////////////////////////////////////////////////
// Set the default account in logon dialog
///////////////////////////////////////////////////////////////
void SetDefAccount(LPCWSTR pszUser, LPCWSTR pszDomain)
{
	HKEY hk;

	ClearAutoLogon();

    if(ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, c_szWinLogon, 0x0, KEY_WRITE, &hk))
    {
		_RegSetSZ(hk, c_szDefUserName, pszUser);
        _RegSetSZ(hk, c_szDefDomain, pszDomain);
       RegCloseKey(hk);
    }
}

///////////////////////////////////////////////////////////////
// Set and clear auto logon for a particular
///////////////////////////////////////////////////////////////
LONG SetAutoLogon(LPCWSTR pszUserName, LPCWSTR pszPassword)
{
    WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH+1];
	DWORD dwComputerName = ARRAYSIZE(szComputerName);
	HKEY hk;

	GetComputerNameW(szComputerName, &dwComputerName);
    SetDefAccount(pszUserName, szComputerName);

	if(ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, c_szWinLogon, 0x0, KEY_WRITE, &hk))
    {
        _RegSetSZ(hk, c_szAutoLogon, L"1");
        _RegDelValue(hk, c_szDefPassword);
        RegCloseKey (hk);
    }

    return SetDefaultPassword(pszPassword);
}

///////////////////////////////////////////////////////////////
// RtlInitUnicodeString
///////////////////////////////////////////////////////////////
void MyRtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
{
    size_t Length;

    DestinationString->Buffer = (PWSTR)SourceString;
	if(SourceString)
		{
			Length = wcslen(SourceString) * sizeof(WCHAR);
			DestinationString->Length = (USHORT)Length;
			DestinationString->MaximumLength = (USHORT)(Length + sizeof(UNICODE_NULL));
        }
	else
		{
			DestinationString->MaximumLength = 0;
			DestinationString->Length = 0;
		}
}

///////////////////////////////////////////////////////////////

WCHAR* GetGroupName(WCHAR* pszAdmins, DWORD cchAdmins, DWORD Group_Rid)
{
	PSID psid;
	SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY;
	BOOL fSuccess = AllocateAndInitializeSid(
		&auth,
		2,
		SECURITY_BUILTIN_DOMAIN_RID,
		Group_Rid,
		0,0,0,0,0,0,
		&psid
		);

	if (fSuccess)
	{
		WCHAR szDomain[DNLEN + 1];
		DWORD cchDomain = ARRAYSIZE(szDomain);
		SID_NAME_USE sUse;

		fSuccess = LookupAccountSidW(NULL, psid, pszAdmins, &cchAdmins, szDomain, &cchDomain, &sUse);

		FreeSid(psid);

		if(fSuccess == TRUE) return pszAdmins;
	}

	return NULL;
}

///////////////////////////////////////////////////////////////

void GetDefAccount(LPCWSTR pszUser, DWORD cbUser)
{
	HKEY hk;
	DWORD dwSize = cbUser;

	if(ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, c_szWinLogon, 0x0, KEY_READ, &hk))
	{
	   RegQueryValueExW(hk, c_szDefUserName, NULL, NULL, (BYTE *)pszUser, &dwSize);
	   RegCloseKey(hk);
	}
}








///////////////////////////////////////////////////////////////
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD qwqwqw;
qwqwqw = CreateNewUser(L"asdsdsd",NULL,NULL,L"Администраторы",True);
Edit1->Text= qwqwqw ;
}
//---------------------------------------------------------------------------
Возвращает Button1Click код 2224, подозреваю, что чтото не так с строками, а в частности с wchar_t *UserGroup. Кто поможет?

Отправлено: 12:41, 05-07-2009

 

Новый участник


Сообщения: 5
Благодарности: 1

Профиль | Отправить PM | Цитировать


Это Вам функция NetUserAdd "говорит" что пользователь уже есть.

В файле <C Builder install dir>/include/lmerr.h находим
Код: Выделить весь код
#define NERR_BASE       2100
....
#define NERR_UserExists         (NERR_BASE+124) /* The account already exists. */
...

Отправлено: 22:58, 05-07-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [С++ Builder 2009] Проблемы с созданием пользователей (наверно все дело в строках)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Import *.tlb - как потом использовать полученный *.h ? (C++ Builder 2009) Sanchos Программирование и базы данных 1 23-06-2009 11:29
C/C++ - [ С++ Builder 2009 ] Управление сетевыми подключениями crashtuak Программирование и базы данных 1 11-06-2009 08:26
C/C++ - [C++Builder 2009] TTreeView crashtuak Программирование и базы данных 4 21-04-2009 07:10
Проблемы с созданием Makefile... Zippy Программирование и базы данных 5 18-08-2004 19:38
Проблемы с созданием FTP Shima Сетевые технологии 3 15-06-2004 14:56




 
Переход