mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 16:32:57 +00:00
[NETAPI32]
- Implement NetLocalGreoupGetInfo. - Move shared code into separate functions. svn path=/trunk/; revision=58004
This commit is contained in:
parent
f9bb0ce058
commit
8cc13f35dd
1 changed files with 299 additions and 76 deletions
|
@ -57,6 +57,109 @@ typedef struct _ENUM_CONTEXT
|
||||||
} ENUM_CONTEXT, *PENUM_CONTEXT;
|
} ENUM_CONTEXT, *PENUM_CONTEXT;
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
NET_API_STATUS
|
||||||
|
BuildAliasInfoBuffer(PALIAS_GENERAL_INFORMATION AliasInfo,
|
||||||
|
DWORD level,
|
||||||
|
LPVOID *Buffer)
|
||||||
|
{
|
||||||
|
LPVOID LocalBuffer = NULL;
|
||||||
|
PLOCALGROUP_INFO_0 LocalInfo0;
|
||||||
|
PLOCALGROUP_INFO_1 LocalInfo1;
|
||||||
|
LPWSTR Ptr;
|
||||||
|
ULONG Size = 0;
|
||||||
|
NET_API_STATUS ApiStatus = NERR_Success;
|
||||||
|
|
||||||
|
*Buffer = NULL;
|
||||||
|
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
Size = sizeof(LOCALGROUP_INFO_0) +
|
||||||
|
AliasInfo->Name.Length + sizeof(WCHAR);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
Size = sizeof(LOCALGROUP_INFO_1) +
|
||||||
|
AliasInfo->Name.Length + sizeof(WCHAR) +
|
||||||
|
AliasInfo->AdminComment.Length + sizeof(WCHAR);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ApiStatus = ERROR_INVALID_LEVEL;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApiStatus = NetApiBufferAllocate(Size, &LocalBuffer);
|
||||||
|
if (ApiStatus != NERR_Success)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
ZeroMemory(LocalBuffer, Size);
|
||||||
|
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
LocalInfo0 = (PLOCALGROUP_INFO_0)LocalBuffer;
|
||||||
|
|
||||||
|
Ptr = (LPWSTR)LocalInfo0++;
|
||||||
|
LocalInfo0->lgrpi0_name = Ptr;
|
||||||
|
|
||||||
|
memcpy(LocalInfo0->lgrpi0_name,
|
||||||
|
AliasInfo->Name.Buffer,
|
||||||
|
AliasInfo->Name.Length);
|
||||||
|
LocalInfo0->lgrpi0_name[AliasInfo->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
LocalInfo1 = (PLOCALGROUP_INFO_1)LocalBuffer;
|
||||||
|
|
||||||
|
Ptr = (LPWSTR)((ULONG_PTR)LocalInfo1 + sizeof(LOCALGROUP_INFO_1));
|
||||||
|
LocalInfo1->lgrpi1_name = Ptr;
|
||||||
|
|
||||||
|
memcpy(LocalInfo1->lgrpi1_name,
|
||||||
|
AliasInfo->Name.Buffer,
|
||||||
|
AliasInfo->Name.Length);
|
||||||
|
LocalInfo1->lgrpi1_name[AliasInfo->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
||||||
|
|
||||||
|
Ptr = (LPWSTR)((ULONG_PTR)Ptr + AliasInfo->Name.Length + sizeof(WCHAR));
|
||||||
|
LocalInfo1->lgrpi1_comment = Ptr;
|
||||||
|
|
||||||
|
memcpy(LocalInfo1->lgrpi1_comment,
|
||||||
|
AliasInfo->AdminComment.Buffer,
|
||||||
|
AliasInfo->AdminComment.Length);
|
||||||
|
LocalInfo1->lgrpi1_comment[AliasInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (ApiStatus == NERR_Success)
|
||||||
|
{
|
||||||
|
*Buffer = LocalBuffer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (LocalBuffer != NULL)
|
||||||
|
NetApiBufferFree(LocalBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ApiStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
FreeAliasInfo(PALIAS_GENERAL_INFORMATION AliasInfo)
|
||||||
|
{
|
||||||
|
if (AliasInfo->Name.Buffer != NULL)
|
||||||
|
SamFreeMemory(AliasInfo->Name.Buffer);
|
||||||
|
|
||||||
|
if (AliasInfo->AdminComment.Buffer != NULL)
|
||||||
|
SamFreeMemory(AliasInfo->AdminComment.Buffer);
|
||||||
|
|
||||||
|
SamFreeMemory(AliasInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/************************************************************
|
/************************************************************
|
||||||
* NetLocalGroupAdd (NETAPI32.@)
|
* NetLocalGroupAdd (NETAPI32.@)
|
||||||
*/
|
*/
|
||||||
|
@ -154,11 +257,7 @@ NET_API_STATUS WINAPI NetLocalGroupEnum(
|
||||||
PSAM_RID_ENUMERATION CurrentAlias;
|
PSAM_RID_ENUMERATION CurrentAlias;
|
||||||
PENUM_CONTEXT EnumContext = NULL;
|
PENUM_CONTEXT EnumContext = NULL;
|
||||||
PSID DomainSid = NULL;
|
PSID DomainSid = NULL;
|
||||||
PLOCALGROUP_INFO_0 LocalInfo0;
|
|
||||||
PLOCALGROUP_INFO_1 LocalInfo1;
|
|
||||||
LPWSTR Ptr;
|
|
||||||
ULONG i;
|
ULONG i;
|
||||||
ULONG Size;
|
|
||||||
SAM_HANDLE AliasHandle = NULL;
|
SAM_HANDLE AliasHandle = NULL;
|
||||||
PALIAS_GENERAL_INFORMATION AliasInfo = NULL;
|
PALIAS_GENERAL_INFORMATION AliasInfo = NULL;
|
||||||
LPVOID Buffer = NULL;
|
LPVOID Buffer = NULL;
|
||||||
|
@ -325,72 +424,15 @@ NET_API_STATUS WINAPI NetLocalGroupEnum(
|
||||||
TRACE("Name: %S\n", AliasInfo->Name.Buffer);
|
TRACE("Name: %S\n", AliasInfo->Name.Buffer);
|
||||||
TRACE("Comment: %S\n", AliasInfo->AdminComment.Buffer);
|
TRACE("Comment: %S\n", AliasInfo->AdminComment.Buffer);
|
||||||
|
|
||||||
switch (level)
|
ApiStatus = BuildAliasInfoBuffer(AliasInfo,
|
||||||
{
|
level,
|
||||||
case 0:
|
&Buffer);
|
||||||
Size = sizeof(LOCALGROUP_INFO_0) +
|
|
||||||
AliasInfo->Name.Length + sizeof(WCHAR);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
Size = sizeof(LOCALGROUP_INFO_1) +
|
|
||||||
AliasInfo->Name.Length + sizeof(WCHAR) +
|
|
||||||
AliasInfo->AdminComment.Length + sizeof(WCHAR);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ApiStatus = ERROR_INVALID_LEVEL;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ApiStatus = NetApiBufferAllocate(Size, &Buffer);
|
|
||||||
if (ApiStatus != NERR_Success)
|
if (ApiStatus != NERR_Success)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
switch (level)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
LocalInfo0 = (PLOCALGROUP_INFO_0)Buffer;
|
|
||||||
|
|
||||||
Ptr = (LPWSTR)LocalInfo0++;
|
|
||||||
LocalInfo0->lgrpi0_name = Ptr;
|
|
||||||
|
|
||||||
memcpy(LocalInfo0->lgrpi0_name,
|
|
||||||
AliasInfo->Name.Buffer,
|
|
||||||
AliasInfo->Name.Length);
|
|
||||||
LocalInfo0->lgrpi0_name[AliasInfo->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
LocalInfo1 = (PLOCALGROUP_INFO_1)Buffer;
|
|
||||||
|
|
||||||
Ptr = (LPWSTR)((ULONG_PTR)LocalInfo1 + sizeof(LOCALGROUP_INFO_1));
|
|
||||||
LocalInfo1->lgrpi1_name = Ptr;
|
|
||||||
|
|
||||||
memcpy(LocalInfo1->lgrpi1_name,
|
|
||||||
AliasInfo->Name.Buffer,
|
|
||||||
AliasInfo->Name.Length);
|
|
||||||
LocalInfo1->lgrpi1_name[AliasInfo->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
|
||||||
|
|
||||||
Ptr = (LPWSTR)((ULONG_PTR)Ptr + AliasInfo->Name.Length + sizeof(WCHAR));
|
|
||||||
LocalInfo1->lgrpi1_comment = Ptr;
|
|
||||||
|
|
||||||
memcpy(LocalInfo1->lgrpi1_comment,
|
|
||||||
AliasInfo->AdminComment.Buffer,
|
|
||||||
AliasInfo->AdminComment.Length);
|
|
||||||
LocalInfo1->lgrpi1_comment[AliasInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (AliasInfo != NULL)
|
if (AliasInfo != NULL)
|
||||||
{
|
{
|
||||||
if (AliasInfo->Name.Buffer != NULL)
|
FreeAliasInfo(AliasInfo);
|
||||||
SamFreeMemory(AliasInfo->Name.Buffer);
|
|
||||||
|
|
||||||
if (AliasInfo->AdminComment.Buffer != NULL)
|
|
||||||
SamFreeMemory(AliasInfo->AdminComment.Buffer);
|
|
||||||
|
|
||||||
SamFreeMemory(AliasInfo);
|
|
||||||
AliasInfo = NULL;
|
AliasInfo = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,15 +481,7 @@ done:
|
||||||
SamCloseHandle(AliasHandle);
|
SamCloseHandle(AliasHandle);
|
||||||
|
|
||||||
if (AliasInfo != NULL)
|
if (AliasInfo != NULL)
|
||||||
{
|
FreeAliasInfo(AliasInfo);
|
||||||
if (AliasInfo->Name.Buffer != NULL)
|
|
||||||
SamFreeMemory(AliasInfo->Name.Buffer);
|
|
||||||
|
|
||||||
if (AliasInfo->AdminComment.Buffer != NULL)
|
|
||||||
SamFreeMemory(AliasInfo->AdminComment.Buffer);
|
|
||||||
|
|
||||||
SamFreeMemory(AliasInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resumehandle != NULL)
|
if (resumehandle != NULL)
|
||||||
*resumehandle = (DWORD_PTR)EnumContext;
|
*resumehandle = (DWORD_PTR)EnumContext;
|
||||||
|
@ -459,20 +493,209 @@ done:
|
||||||
return ApiStatus;
|
return ApiStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/************************************************************
|
/************************************************************
|
||||||
* NetLocalGroupGetInfo (NETAPI32.@)
|
* NetLocalGroupGetInfo (NETAPI32.@)
|
||||||
*/
|
*/
|
||||||
NET_API_STATUS WINAPI NetLocalGroupGetInfo(
|
NET_API_STATUS
|
||||||
|
WINAPI
|
||||||
|
NetLocalGroupGetInfo(
|
||||||
LPCWSTR servername,
|
LPCWSTR servername,
|
||||||
LPCWSTR groupname,
|
LPCWSTR groupname,
|
||||||
DWORD level,
|
DWORD level,
|
||||||
LPBYTE* bufptr)
|
LPBYTE* bufptr)
|
||||||
{
|
{
|
||||||
|
UNICODE_STRING ServerName;
|
||||||
|
UNICODE_STRING GroupName;
|
||||||
|
SAM_HANDLE ServerHandle = NULL;
|
||||||
|
SAM_HANDLE DomainHandle = NULL;
|
||||||
|
SAM_HANDLE AliasHandle = NULL;
|
||||||
|
PSID DomainSid = NULL;
|
||||||
|
PULONG RelativeIds = NULL;
|
||||||
|
PSID_NAME_USE Use = NULL;
|
||||||
|
PALIAS_GENERAL_INFORMATION AliasInfo = NULL;
|
||||||
|
LPVOID Buffer = NULL;
|
||||||
|
NET_API_STATUS ApiStatus = NERR_Success;
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
FIXME("(%s %s %d %p) stub!\n", debugstr_w(servername),
|
FIXME("(%s %s %d %p) stub!\n", debugstr_w(servername),
|
||||||
debugstr_w(groupname), level, bufptr);
|
debugstr_w(groupname), level, bufptr);
|
||||||
|
|
||||||
|
if (servername != NULL)
|
||||||
|
RtlInitUnicodeString(&ServerName, servername);
|
||||||
|
|
||||||
|
RtlInitUnicodeString(&GroupName, groupname);
|
||||||
|
|
||||||
|
/* Connect to the SAM Server */
|
||||||
|
Status = SamConnect((servername != NULL) ? &ServerName : NULL,
|
||||||
|
&ServerHandle,
|
||||||
|
SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("SamConnect failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the Builtin Domain SID */
|
||||||
|
Status = GetBuiltinDomainSid(&DomainSid);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open the Builtin Domain */
|
||||||
|
Status = SamOpenDomain(ServerHandle,
|
||||||
|
DOMAIN_LOOKUP,
|
||||||
|
DomainSid,
|
||||||
|
&DomainHandle);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("SamOpenDomain failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the RID for the given user name */
|
||||||
|
Status = SamLookupNamesInDomain(DomainHandle,
|
||||||
|
1,
|
||||||
|
&GroupName,
|
||||||
|
&RelativeIds,
|
||||||
|
&Use);
|
||||||
|
if (!NT_SUCCESS(Status) && Status != STATUS_NONE_MAPPED)
|
||||||
|
{
|
||||||
|
ERR("SamOpenDomain failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Status == STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* FIXME: Check Use*/
|
||||||
|
|
||||||
|
Status = SamOpenAlias(DomainHandle,
|
||||||
|
ALIAS_READ_INFORMATION,
|
||||||
|
RelativeIds[0],
|
||||||
|
&AliasHandle);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("SamOpenDomain failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AliasHandle == NULL)
|
||||||
|
{
|
||||||
|
if (RelativeIds != NULL)
|
||||||
|
SamFreeMemory(RelativeIds);
|
||||||
|
|
||||||
|
if (Use != NULL)
|
||||||
|
SamFreeMemory(Use);
|
||||||
|
|
||||||
|
if (DomainSid != NULL)
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
|
||||||
|
|
||||||
|
if (DomainHandle != NULL)
|
||||||
|
SamCloseHandle(DomainHandle);
|
||||||
|
|
||||||
|
|
||||||
|
/* Get the Account Domain SID */
|
||||||
|
Status = GetAccountDomainSid((servername != NULL) ? &ServerName : NULL,
|
||||||
|
&DomainSid);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open the Acount Domain */
|
||||||
|
Status = SamOpenDomain(ServerHandle,
|
||||||
|
DOMAIN_LOOKUP,
|
||||||
|
DomainSid,
|
||||||
|
&DomainHandle);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("SamOpenDomain failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the RID for the given user name */
|
||||||
|
Status = SamLookupNamesInDomain(DomainHandle,
|
||||||
|
1,
|
||||||
|
&GroupName,
|
||||||
|
&RelativeIds,
|
||||||
|
&Use);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("SamOpenDomain failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Check Use*/
|
||||||
|
|
||||||
|
Status = SamOpenAlias(DomainHandle,
|
||||||
|
ALIAS_READ_INFORMATION,
|
||||||
|
RelativeIds[0],
|
||||||
|
&AliasHandle);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("SamOpenDomain failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = SamQueryInformationAlias(AliasHandle,
|
||||||
|
AliasGeneralInformation,
|
||||||
|
(PVOID *)&AliasInfo);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("SamQueryInformationAlias failed (Status %08lx)\n", Status);
|
||||||
|
ApiStatus = NetpNtStatusToApiStatus(Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApiStatus = BuildAliasInfoBuffer(AliasInfo,
|
||||||
|
level,
|
||||||
|
&Buffer);
|
||||||
|
if (ApiStatus != NERR_Success)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (AliasInfo != NULL)
|
||||||
|
FreeAliasInfo(AliasInfo);
|
||||||
|
|
||||||
|
if (AliasHandle != NULL)
|
||||||
|
SamCloseHandle(AliasHandle);
|
||||||
|
|
||||||
|
if (RelativeIds != NULL)
|
||||||
|
SamFreeMemory(RelativeIds);
|
||||||
|
|
||||||
|
if (Use != NULL)
|
||||||
|
SamFreeMemory(Use);
|
||||||
|
|
||||||
|
if (DomainSid != NULL)
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
|
||||||
|
|
||||||
|
if (DomainHandle != NULL)
|
||||||
|
SamCloseHandle(DomainHandle);
|
||||||
|
|
||||||
|
if (ServerHandle != NULL)
|
||||||
|
SamCloseHandle(ServerHandle);
|
||||||
|
|
||||||
|
*bufptr = (LPBYTE)Buffer;
|
||||||
|
|
||||||
return NERR_Success;
|
return NERR_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/************************************************************
|
/************************************************************
|
||||||
* NetLocalGroupGetMembers (NETAPI32.@)
|
* NetLocalGroupGetMembers (NETAPI32.@)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue