diff --git a/reactos/dll/win32/lsasrv/CMakeLists.txt b/reactos/dll/win32/lsasrv/CMakeLists.txt index aac851095db..c4a05126318 100644 --- a/reactos/dll/win32/lsasrv/CMakeLists.txt +++ b/reactos/dll/win32/lsasrv/CMakeLists.txt @@ -27,7 +27,7 @@ add_library(lsasrv SHARED ${SOURCE}) set_module_type(lsasrv win32dll ENTRYPOINT 0 UNICODE) target_link_libraries(lsasrv wine ${PSEH_LIB}) -add_importlibs(lsasrv rpcrt4 msvcrt kernel32 ntdll) +add_importlibs(lsasrv rpcrt4 msvcrt kernel32 advapi32 ntdll) add_pch(lsasrv lsasrv.h) add_dependencies(lsasrv psdk) add_cd_file(TARGET lsasrv DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index 7bb77141a7c..2fe2d66ece8 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -310,8 +310,65 @@ NTSTATUS WINAPI LsarCreateAccount( ACCESS_MASK DesiredAccess, LSAPR_HANDLE *AccountHandle) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + LSAPR_HANDLE AccountsHandle; + LSAPR_HANDLE Account; + LPWSTR SidString; + NTSTATUS Status; + + /* Validate the PolicyHandle */ + Status = LsapValidateDbObject(PolicyHandle, + LsaDbPolicyObject, + POLICY_CREATE_ACCOUNT); + if (!NT_SUCCESS(Status)) + { + ERR("LsapValidateDbObject returned 0x%08lx\n", Status); + return Status; + } + + /* Open the Accounts object */ + AccountsHandle = LsapCreateDbObject(PolicyHandle, + L"Accounts", + TRUE, + LsaDbContainerObject, + 0); + if (AccountsHandle == NULL) + { + ERR("LsapCreateDbObject (Accounts) failed\n"); + return STATUS_UNSUCCESSFUL; + } + + /* Create SID string */ + if (!ConvertSidToStringSid((PSID)AccountSid, + &SidString)) + { + ERR("ConvertSidToStringSid failed\n"); + return STATUS_UNSUCCESSFUL; + } + + /* Create the Account object */ + Account = LsapCreateDbObject(AccountsHandle, + SidString, + FALSE, + LsaDbAccountObject, + DesiredAccess); + if (Account != NULL) + { + /* Set the Sid attribute */ + Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)Account, + L"Sid", + (PVOID)AccountSid, + GetLengthSid(AccountSid)); + if (NT_SUCCESS(Status)) + { + *AccountHandle = Account; + } + } + + LocalFree(SidString); + + LsapCloseDbObject(AccountsHandle); + + return STATUS_SUCCESS; } diff --git a/reactos/dll/win32/lsasrv/lsasrv.h b/reactos/dll/win32/lsasrv/lsasrv.h index 769436d3f64..3e17f36f31a 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.h +++ b/reactos/dll/win32/lsasrv/lsasrv.h @@ -17,8 +17,8 @@ #include #include - #include +#include #include