1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer/*
2f0eac53a97037ee18478b5aedc479b498ed6702Tinderbox User * Portions Copyright (C) 2001, 2002, 2004, 2007, 2009, 2013, 2016, 2017 Internet Systems Consortium, Inc. ("ISC")
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater/* $Id: AccountInfo.cpp,v 1.10 2009/09/29 23:48:04 tbox Exp $ */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
c3c8823fed039b3a2b8e5ca8bc2f3301d1dd840eMark Andrews/* Compiled with UNICODE */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#include "stdafx.h"
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#include <windows.h>
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#include <lm.h>
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#include <ntsecapi.h>
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#include <isc/ntgroups.h>
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer#include <isc/result.h>
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#include "AccountInfo.h"
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#define MAX_NAME_LENGTH 256
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerNTSTATUS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerOpenPolicy(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPWSTR ServerName, /* machine to open policy on (Unicode) */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer DWORD DesiredAccess, /* desired access to policy */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PLSA_HANDLE PolicyHandle /* resultant policy handle */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer );
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerBOOL
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerGetAccountSid(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPTSTR SystemName, /* where to lookup account */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPTSTR AccountName, /* account of interest */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PSID *Sid /* resultant buffer containing SID */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer );
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerNTSTATUS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerSetPrivilegeOnAccount(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LSA_HANDLE PolicyHandle, /* open policy handle */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PSID AccountSid, /* SID to grant privilege to */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPWSTR PrivilegeName, /* privilege to grant (Unicode) */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer BOOL bEnable /* enable or disable */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer );
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerNTSTATUS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerGetPrivilegesOnAccount(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LSA_HANDLE PolicyHandle, /* open policy handle */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PSID AccountSid, /* SID to grant privilege to */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer wchar_t **PrivList, /* Ptr to List of Privileges found */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer unsigned int *PrivCount /* total number of Privileges in list */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer );
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerNTSTATUS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerAddPrivilegeToAcccount(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPTSTR AccountName, /* Name of the account */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPWSTR PrivilegeName /* Privilege to Add */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer );
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayervoid
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerInitLsaString(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PLSA_UNICODE_STRING LsaString, /* destination */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPWSTR String /* source (Unicode) */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer );
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayervoid
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerDisplayNtStatus(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPSTR szAPI, /* pointer to function name (ANSI) */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer NTSTATUS Status /* NTSTATUS error value */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer );
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayervoid
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerDisplayWinError(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPSTR szAPI, /* pointer to function name (ANSI) */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer DWORD WinError /* DWORD WinError */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer );
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#ifndef STATUS_SUCCESS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer#endif
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer/*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Note that this code only retrieves the list of privileges of the
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * requested account or group. However, all accounts belong to the
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Everyone group even though that group is not returned by the
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * calls to get the groups to which that account belongs.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * The Everyone group has two privileges associated with it:
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * SeChangeNotifyPrivilege and SeNetworkLogonRight
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * It is not advisable to disable or remove these privileges
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * from the group nor can the account be removed from the Everyone
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * group
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * The None group has no privileges associated with it and is the group
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * to which an account belongs if it is associated with no group.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayerint
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerGetAccountPrivileges(char *name, wchar_t **PrivList, unsigned int *PrivCount,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer char **Accounts, unsigned int *totalAccounts,
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater int maxAccounts)
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson{
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LSA_HANDLE PolicyHandle;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer TCHAR AccountName[256]; /* static account name buffer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PSID pSid;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer unsigned int i;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer NTSTATUS Status;
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer isc_result_t istatus;
4cef36044caea537bb4671bcef6a4d2c0a85ab62Andreas Gustafsson int iRetVal = RTN_ERROR; /* assume error from main */
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews int n;
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Open the policy on the target machine.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if ((Status = OpenPolicy(NULL,
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson POLICY_LOOKUP_NAMES,
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson &PolicyHandle)) != STATUS_SUCCESS)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (RTN_ERROR);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Let's see if the account exists. Return if not
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews n = wnsprintf(AccountName, sizeof(AccountName), TEXT("%hS"), name);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews if (n < 0 || (size_t)n >= sizeof(AccountName)) {
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews LsaClose(PolicyHandle);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews return (RTN_ERROR);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews }
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews if (!GetAccountSid(NULL, AccountName, &pSid)) {
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews LsaClose(PolicyHandle);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (RTN_NOACCOUNT);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews }
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Find out what groups the account belongs to
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer istatus = isc_ntsecurity_getaccountgroups(name, Accounts, maxAccounts,
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer totalAccounts);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews if (istatus == ISC_R_NOMEMORY) {
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews LsaClose(PolicyHandle);
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer return (RTN_NOMEMORY);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews } else if (istatus != ISC_R_SUCCESS) {
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews LsaClose(PolicyHandle);
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer return (RTN_ERROR);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer Accounts[*totalAccounts] = name; /* Add the account to the list */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer (*totalAccounts)++;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Loop through each Account to get the list of privileges
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson for (i = 0; i < *totalAccounts; i++) {
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews n = wnsprintf(AccountName, sizeof(AccountName), TEXT("%hS"),
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews Accounts[i]);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews if (n < 0 || (size_t)n >= sizeof(AccountName)) {
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews continue;
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews }
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews /* Obtain the SID of the user/group. */
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews if (!GetAccountSid(NULL, AccountName, &pSid)) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer continue; /* Try the next one */
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews }
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater /* Get the Privileges allocated to this SID */
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater if ((Status = GetPrivilegesOnAccount(PolicyHandle, pSid,
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson PrivList, PrivCount)) == STATUS_SUCCESS)
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer iRetVal=RTN_OK;
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (pSid != NULL)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer HeapFree(GetProcessHeap(), 0, pSid);
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson } else {
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (pSid != NULL)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer HeapFree(GetProcessHeap(), 0, pSid);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer continue; /* Try the next one */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Close the policy handle.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LsaClose(PolicyHandle);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer (*totalAccounts)--; /* Correct for the number of groups */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return iRetVal;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerBOOL
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerCreateServiceAccount(char *name, char *password) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer NTSTATUS retstat;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer USER_INFO_1 ui;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer DWORD dwLevel = 1;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer DWORD dwError = 0;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer NET_API_STATUS nStatus;
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson
1e733ffc1103667dd6cf0eae01f5dfd0c84c5108Mark Andrews size_t namelen = strlen(name);
1e733ffc1103667dd6cf0eae01f5dfd0c84c5108Mark Andrews size_t passwdlen = strlen(password);
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer wchar_t AccountName[MAX_NAME_LENGTH];
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer wchar_t AccountPassword[MAX_NAME_LENGTH];
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer mbstowcs(AccountName, name, namelen + 1);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer mbstowcs(AccountPassword, password, passwdlen + 1);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Set up the USER_INFO_1 structure.
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater * USER_PRIV_USER: name is required here when creating an account
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * rather than an administrator or a guest.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer ui.usri1_name = (LPWSTR) &AccountName;
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer ui.usri1_password = (LPWSTR) &AccountPassword;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer ui.usri1_priv = USER_PRIV_USER;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer ui.usri1_home_dir = NULL;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer ui.usri1_comment = L"ISC BIND Service Account";
c9fb8b9f199022c2fd18c1c13788d7564b02265fDanny Mayer ui.usri1_flags = UF_PASSWD_CANT_CHANGE | UF_DONT_EXPIRE_PASSWD |
c9fb8b9f199022c2fd18c1c13788d7564b02265fDanny Mayer UF_SCRIPT;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer ui.usri1_script_path = NULL;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Call the NetUserAdd function, specifying level 1.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer nStatus = NetUserAdd(NULL, dwLevel, (LPBYTE)&ui, &dwError);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (nStatus != NERR_Success)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (FALSE);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer retstat = AddPrivilegeToAcccount(name, SE_SERVICE_LOGON_PRIV);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (TRUE);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerNTSTATUS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerAddPrivilegeToAcccount(LPTSTR name, LPWSTR PrivilegeName) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LSA_HANDLE PolicyHandle;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer TCHAR AccountName[256]; /* static account name buffer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PSID pSid;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer NTSTATUS Status;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer unsigned long err;
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews int n;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Open the policy on the target machine.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if ((Status = OpenPolicy(NULL, POLICY_ALL_ACCESS, &PolicyHandle))
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson != STATUS_SUCCESS)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (RTN_ERROR);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Let's see if the account exists. Return if not
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews n = wnsprintf(AccountName, sizeof(AccountName), TEXT("%hS"), name);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews if (n < 0 || (size_t)n >= sizeof(AccountName)) {
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews LsaClose(PolicyHandle);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews return (RTN_ERROR);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews }
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews if (!GetAccountSid(NULL, AccountName, &pSid)) {
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews LsaClose(PolicyHandle);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (RTN_NOACCOUNT);
fcb5e646e4d775539e348fa21ba13307f2695bf5Mark Andrews }
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater err = LsaNtStatusToWinError(SetPrivilegeOnAccount(PolicyHandle,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer pSid, PrivilegeName, TRUE));
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LsaClose(PolicyHandle);
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (err == ERROR_SUCCESS)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (RTN_OK);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer else
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (err);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayervoid
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerInitLsaString(PLSA_UNICODE_STRING LsaString, LPWSTR String){
1e733ffc1103667dd6cf0eae01f5dfd0c84c5108Mark Andrews size_t StringLength;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer if (String == NULL) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LsaString->Buffer = NULL;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LsaString->Length = 0;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LsaString->MaximumLength = 0;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer StringLength = wcslen(String);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LsaString->Buffer = String;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LsaString->Length = (USHORT) StringLength * sizeof(WCHAR);
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson LsaString->MaximumLength = (USHORT)(StringLength+1) * sizeof(WCHAR);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerNTSTATUS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerOpenPolicy(LPWSTR ServerName, DWORD DesiredAccess, PLSA_HANDLE PolicyHandle){
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LSA_OBJECT_ATTRIBUTES ObjectAttributes;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LSA_UNICODE_STRING ServerString;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PLSA_UNICODE_STRING Server = NULL;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Always initialize the object attributes to all zeroes.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer if (ServerName != NULL) {
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson /*
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson * Make a LSA_UNICODE_STRING out of the LPWSTR passed in
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer InitLsaString(&ServerString, ServerName);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer Server = &ServerString;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Attempt to open the policy.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (LsaOpenPolicy(Server, &ObjectAttributes, DesiredAccess,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PolicyHandle));
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerBOOL
84b0ad095922000fcc017f18cd294691c126d0c4Andreas GustafssonGetAccountSid(LPTSTR SystemName, LPTSTR AccountName, PSID *Sid) {
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson LPTSTR ReferencedDomain = NULL;
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson DWORD cbSid = 128; /* initial allocation attempt */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson DWORD cbReferencedDomain = 16; /* initial allocation size */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer SID_NAME_USE peUse;
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson BOOL bSuccess = FALSE; /* assume this function will fail */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer __try {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * initial memory allocations
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if ((*Sid = HeapAlloc(GetProcessHeap(), 0, cbSid)) == NULL)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer __leave;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if ((ReferencedDomain = (LPTSTR) HeapAlloc(GetProcessHeap(), 0,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer cbReferencedDomain)) == NULL) __leave;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /*
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer * Obtain the SID of the specified account on the specified system.
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson while (!LookupAccountName(SystemName, AccountName, *Sid, &cbSid,
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson ReferencedDomain, &cbReferencedDomain,
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson &peUse))
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /* reallocate memory */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if ((*Sid = HeapReAlloc(GetProcessHeap(), 0,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer *Sid, cbSid)) == NULL) __leave;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if ((ReferencedDomain= (LPTSTR) HeapReAlloc(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer GetProcessHeap(), 0, ReferencedDomain,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer cbReferencedDomain)) == NULL)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer __leave;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater else
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson __leave;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson bSuccess = TRUE;
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson } /* finally */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer __finally {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson /* Cleanup and indicate failure, if appropriate. */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer HeapFree(GetProcessHeap(), 0, ReferencedDomain);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (!bSuccess) {
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (*Sid != NULL) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer HeapFree(GetProcessHeap(), 0, *Sid);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer *Sid = NULL;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (bSuccess);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerNTSTATUS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerSetPrivilegeOnAccount(LSA_HANDLE PolicyHandle, PSID AccountSid,
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson LPWSTR PrivilegeName, BOOL bEnable)
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson{
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LSA_UNICODE_STRING PrivilegeString;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /* Create a LSA_UNICODE_STRING for the privilege name. */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer InitLsaString(&PrivilegeString, PrivilegeName);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /* grant or revoke the privilege, accordingly */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (bEnable)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (LsaAddAccountRights(PolicyHandle, AccountSid,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer &PrivilegeString, 1));
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson else
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (LsaRemoveAccountRights(PolicyHandle, AccountSid,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer FALSE, &PrivilegeString, 1));
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerNTSTATUS
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny MayerGetPrivilegesOnAccount(LSA_HANDLE PolicyHandle, PSID AccountSid,
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater wchar_t **PrivList, unsigned int *PrivCount)
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson{
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer NTSTATUS Status;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LSA_UNICODE_STRING *UserRights;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer ULONG CountOfRights;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer unsigned int retlen = 0;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer DWORD i, j;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer int found;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer Status = LsaEnumerateAccountRights(PolicyHandle, AccountSid,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer &UserRights, &CountOfRights);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /* Only continue if there is something */
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (UserRights == NULL || Status != STATUS_SUCCESS)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (Status);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson for (i = 0; i < CountOfRights; i++) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer found = -1;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer retlen = UserRights[i].Length/sizeof(wchar_t);
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson for (j = 0; j < *PrivCount; j++) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer found = wcsncmp(PrivList[j], UserRights[i].Buffer,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer retlen);
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (found == 0)
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer break;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (found != 0) {
61dd99bfae0ffa8ec193cf48fc86e4fa246a06e2Automatic Updater PrivList[*PrivCount] =
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer (wchar_t *)malloc(UserRights[i].MaximumLength);
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer if (PrivList[*PrivCount] == NULL)
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer return (RTN_NOMEMORY);
290e1b94e4d4a330acb9e45c15cc4a6369065a22Danny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer wcsncpy(PrivList[*PrivCount], UserRights[i].Buffer,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer retlen);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer PrivList[*PrivCount][retlen] = L'\0';
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer (*PrivCount)++;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer return (Status);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayervoid
84b0ad095922000fcc017f18cd294691c126d0c4Andreas GustafssonDisplayNtStatus(LPSTR szAPI, NTSTATUS Status) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /* Convert the NTSTATUS to Winerror. Then call DisplayWinError(). */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer DisplayWinError(szAPI, LsaNtStatusToWinError(Status));
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayervoid
84b0ad095922000fcc017f18cd294691c126d0c4Andreas GustafssonDisplayWinError(LPSTR szAPI, DWORD WinError) {
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LPSTR MessageBuffer;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer DWORD dwBufferLength;
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson if (dwBufferLength=FormatMessageA(
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer NULL, WinError, GetUserDefaultLangID(),
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer (LPSTR) &MessageBuffer, 0, NULL)){
84b0ad095922000fcc017f18cd294691c126d0c4Andreas Gustafsson DWORD dwBytesWritten; /* unused */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /* Output message string on stderr. */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer WriteFile(GetStdHandle(STD_ERROR_HANDLE), MessageBuffer,
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer dwBufferLength, &dwBytesWritten, NULL);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer /* Free the buffer allocated by the system. */
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer LocalFree(MessageBuffer);
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer }
1ebeb6bbf3c25a710ed7b6fbd2608f3850fc7f8fDanny Mayer}