SetNetworkAccountSID.cpp [plain text]
#include <sys/param.h>
#include <sys/errno.h>
#include <sys/stat.h>
#include <err.h>
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <stdlib.h>
#include <sysexits.h>
#include <stdint.h>
#include <netsmb/smb.h>
#include <smbclient/smbclient.h>
#include <smbclient/smbclient_internal.h>
#include <smbclient/smbclient_netfs.h>
#include <smbclient/ntstatus.h>
#include "SetNetworkAccountSID.h"
#include "LsarLookup.h"
#define MAX_SID_PRINTBUFFER 256
static
void print_ntsid(ntsid_t *sidptr, const char *account, const char *domain)
{
char sidprintbuf[MAX_SID_PRINTBUFFER];
char *s = sidprintbuf;
int subs;
uint64_t auth = 0;
unsigned i;
uint32_t *ip;
size_t len;
bzero(sidprintbuf, MAX_SID_PRINTBUFFER);
for (i = 0; i < sizeof(sidptr->sid_authority); i++)
auth = (auth << 8) | sidptr->sid_authority[i];
s += snprintf(s, MAX_SID_PRINTBUFFER, "S-%u-%llu", sidptr->sid_kind, auth);
subs = sidptr->sid_authcount;
for (ip = sidptr->sid_authorities; subs--; ip++) {
len = MAX_SID_PRINTBUFFER - (s - sidprintbuf);
s += snprintf(s, len, "-%u", *ip);
}
SMBLogInfo("%s\\%s network sid %s \n", ASL_LEVEL_DEBUG,
(domain) ? domain : "", (account) ? account : "", sidprintbuf);
}
void setNetworkAccountSID(void *sessionRef, void *args)
{
#pragma unused(args)
SMBHANDLE serverConnection = SMBAllocateAndSetContext(sessionRef);
ntsid_t *ntsid = NULL;
SMBServerPropertiesV1 properties;
NTSTATUS status;
char *account = NULL, *domain = NULL;
if (!serverConnection) {
goto done;
}
status = SMBGetServerProperties(serverConnection, &properties, kPropertiesVersion, sizeof(properties));
if (!NT_SUCCESS(status)) {
goto done;
}
if (properties.internalFlags & kHasNtwrkSID) {
goto done;
}
if ((properties.authType == kSMBAuthTypeGuest) || (properties.authType == kSMBAuthTypeAnonymous)) {
goto done;
}
status = GetNetworkAccountSID(properties.serverName, &account, &domain, &ntsid);
if (!NT_SUCCESS(status)) {
goto done;
}
print_ntsid(ntsid, account, domain);
(void)SMBSetNetworkIdentity(serverConnection, ntsid, account, domain);
done:
if (account) {
free(account);
}
if (domain) {
free(domain);
}
if (ntsid) {
free(ntsid);
}
if (serverConnection) {
free(serverConnection);
}
}