/* INCLUDES ******************************************************************/
-#include <stdarg.h>
-
-#include "ntstatus.h"
-#define WIN32_NO_STATUS
-#include "windef.h"
-#include "winbase.h"
-#include "winerror.h"
-#include "lmcons.h"
-#include "ntsecapi.h"
-#include "wine/debug.h"
-
-#define NTOS_MODE_USER
-#include <ndk/rtlfuncs.h>
-#include "ntsam.h"
#include "netapi32.h"
-
WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
-
/* GLOBALS *******************************************************************/
static SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY};
-
/* FUNCTIONS *****************************************************************/
NTSTATUS
-GetAccountDomainSid(PSID *AccountDomainSid)
+GetAccountDomainSid(IN PUNICODE_STRING ServerName,
+ OUT PSID *AccountDomainSid)
{
PPOLICY_ACCOUNT_DOMAIN_INFO AccountDomainInfo = NULL;
LSA_OBJECT_ATTRIBUTES ObjectAttributes;
memset(&ObjectAttributes, 0, sizeof(LSA_OBJECT_ATTRIBUTES));
- Status = LsaOpenPolicy(NULL,
+ Status = LsaOpenPolicy(ServerName,
&ObjectAttributes,
POLICY_VIEW_LOCAL_INFORMATION,
&PolicyHandle);
NTSTATUS
-GetBuiltinDomainSid(PSID *BuiltinDomainSid)
+GetBuiltinDomainSid(OUT PSID *BuiltinDomainSid)
{
PSID Sid = NULL;
PULONG Ptr;
return Status;
}
+
+NTSTATUS
+OpenAccountDomain(IN SAM_HANDLE ServerHandle,
+ IN PUNICODE_STRING ServerName,
+ IN ULONG DesiredAccess,
+ OUT PSAM_HANDLE DomainHandle)
+{
+ PSID DomainSid = NULL;
+ NTSTATUS Status;
+
+ Status = GetAccountDomainSid(ServerName,
+ &DomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
+ return Status;
+ }
+
+ Status = SamOpenDomain(ServerHandle,
+ DesiredAccess,
+ DomainSid,
+ DomainHandle);
+
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+OpenBuiltinDomain(IN SAM_HANDLE ServerHandle,
+ IN ULONG DesiredAccess,
+ OUT PSAM_HANDLE DomainHandle)
+{
+ PSID DomainSid = NULL;
+ NTSTATUS Status;
+
+ Status = GetBuiltinDomainSid(&DomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status);
+ return Status;
+ }
+
+ Status = SamOpenDomain(ServerHandle,
+ DesiredAccess,
+ DomainSid,
+ DomainHandle);
+
+ RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ }
+
+ return Status;
+}
+
+
+NET_API_STATUS
+BuildSidFromSidAndRid(IN PSID SrcSid,
+ IN ULONG RelativeId,
+ OUT PSID *DestSid)
+{
+ UCHAR RidCount;
+ PSID DstSid;
+ ULONG i;
+ ULONG DstSidSize;
+ PULONG p, q;
+ NET_API_STATUS ApiStatus = NERR_Success;
+
+ RidCount = *RtlSubAuthorityCountSid(SrcSid);
+ if (RidCount >= 8)
+ return ERROR_INVALID_PARAMETER;
+
+ DstSidSize = RtlLengthRequiredSid(RidCount + 1);
+
+ ApiStatus = NetApiBufferAllocate(DstSidSize,
+ &DstSid);
+ if (ApiStatus != NERR_Success)
+ return ApiStatus;
+
+ RtlInitializeSid(DstSid,
+ RtlIdentifierAuthoritySid(SrcSid),
+ RidCount + 1);
+
+ for (i = 0; i < (ULONG)RidCount; i++)
+ {
+ p = RtlSubAuthoritySid(SrcSid, i);
+ q = RtlSubAuthoritySid(DstSid, i);
+ *q = *p;
+ }
+
+ q = RtlSubAuthoritySid(DstSid, (ULONG)RidCount);
+ *q = RelativeId;
+
+ *DestSid = DstSid;
+
+ return NERR_Success;
+}
+
/* EOF */