* passwd.c (GetPW): If server is NULL, and the user is not a local
user, try to fetch the DC to use as server. (ChangePW): Get Windows username via extra parameter. (usage): Reduce -d help text to reflect above change. (main): Fix typo in comment. Call GetPW and ChangePW as per the changes above.
This commit is contained in:
parent
764d261276
commit
cfd6979c39
|
@ -1,3 +1,12 @@
|
|||
2014-11-24 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* passwd.c (GetPW): If server is NULL, and the user is not a local
|
||||
user, try to fetch the DC to use as server.
|
||||
(ChangePW): Get Windows username via extra parameter.
|
||||
(usage): Reduce -d help text to reflect above change.
|
||||
(main): Fix typo in comment. Call GetPW and ChangePW as per the
|
||||
changes above.
|
||||
|
||||
2014-11-12 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* mkgroup.c (usage): Fix language.
|
||||
|
|
|
@ -17,6 +17,7 @@ details. */
|
|||
#include <lmerr.h>
|
||||
#include <lmcons.h>
|
||||
#include <lmapibuf.h>
|
||||
#include <dsgetdc.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -115,7 +116,7 @@ EvalRet (int ret, const char *user)
|
|||
}
|
||||
|
||||
PUSER_INFO_3
|
||||
GetPW (char *user, int print_win_name, LPCWSTR server)
|
||||
GetPW (char *user, int print_win_name, LPWSTR *server)
|
||||
{
|
||||
char usr_buf[UNLEN + 1];
|
||||
WCHAR name[UNLEN + 1];
|
||||
|
@ -124,7 +125,7 @@ GetPW (char *user, int print_win_name, LPCWSTR server)
|
|||
struct passwd *pw;
|
||||
char *domain = (char *) alloca (INTERNET_MAX_HOST_NAME_LENGTH + 1);
|
||||
|
||||
/* Try getting a Win32 username in case the user edited /etc/passwd */
|
||||
/* Get the Win32 username and a suitable server. */
|
||||
if ((pw = getpwnam (user)))
|
||||
{
|
||||
cygwin_internal (CW_EXTRACT_DOMAIN_AND_USER, pw, domain, usr_buf);
|
||||
|
@ -138,20 +139,38 @@ GetPW (char *user, int print_win_name, LPCWSTR server)
|
|||
printf ("Windows username : %s\n", user);
|
||||
}
|
||||
}
|
||||
if (!*server)
|
||||
{
|
||||
PDOMAIN_CONTROLLER_INFOW dci;
|
||||
char machine[INTERNET_MAX_HOST_NAME_LENGTH + 1];
|
||||
DWORD mlen = sizeof machine;
|
||||
WCHAR wdom[INTERNET_MAX_HOST_NAME_LENGTH + 1];
|
||||
|
||||
/* If we can't fetch the local machine name, or if the machine name
|
||||
is not the same as the user's domain name, try to fetch the DC via
|
||||
DsGetDcName. Otherwise, just stick to a NULL servername, since
|
||||
that's the same as using the local machine. */
|
||||
if (!GetComputerNameExA (ComputerNameNetBIOS, machine, &mlen)
|
||||
|| strcasecmp (domain, machine) != 0)
|
||||
{
|
||||
mbstowcs (wdom, domain, INTERNET_MAX_HOST_NAME_LENGTH + 1);
|
||||
if (!DsGetDcNameW (NULL, wdom, NULL, NULL, DS_IS_FLAT_NAME, &dci))
|
||||
*server = dci->DomainControllerName;
|
||||
}
|
||||
}
|
||||
}
|
||||
mbstowcs (name, user, UNLEN + 1);
|
||||
ret = NetUserGetInfo (server, name, 3, (void *) &ui);
|
||||
ret = NetUserGetInfo (*server, name, 3, (void *) &ui);
|
||||
return EvalRet (ret, user) ? NULL : ui;
|
||||
}
|
||||
|
||||
int
|
||||
ChangePW (const char *user, const char *oldpwd, const char *pwd, int justcheck,
|
||||
LPCWSTR server)
|
||||
ChangePW (const char *user, PCWSTR name, const char *oldpwd, const char *pwd,
|
||||
int justcheck, LPCWSTR server)
|
||||
{
|
||||
WCHAR name[UNLEN + 1], oldpass[512], pass[512];
|
||||
WCHAR oldpass[512], pass[512];
|
||||
DWORD ret;
|
||||
|
||||
mbstowcs (name, user, UNLEN + 1);
|
||||
mbstowcs (pass, pwd, 512);
|
||||
if (!oldpwd)
|
||||
{
|
||||
|
@ -281,9 +300,7 @@ usage (FILE * stream, int status)
|
|||
"\n"
|
||||
"Other options:\n"
|
||||
" -d, --logonserver SERVER connect to SERVER (e.g. domain controller).\n"
|
||||
" Default server is the local system, unless\n"
|
||||
" changing the current user, in which case the\n"
|
||||
" default is the content of $LOGONSERVER.\n"
|
||||
" Usually not required.\n"
|
||||
" -S, --status display password status for USER (locked, expired,\n"
|
||||
" etc.) plus global system password settings.\n"
|
||||
" -h, --help output usage information and exit.\n"
|
||||
|
@ -482,7 +499,7 @@ main (int argc, char **argv)
|
|||
break;
|
||||
|
||||
case 'V':
|
||||
case 'v': /* Keep this option for historrical reasons,
|
||||
case 'v': /* Keep this option for historical reasons,
|
||||
but don't advertize it. */
|
||||
print_version ();
|
||||
exit (0);
|
||||
|
@ -590,7 +607,7 @@ main (int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
ui = GetPW (user, 1, server);
|
||||
ui = GetPW (user, 1, &server);
|
||||
if (!ui)
|
||||
return 1;
|
||||
|
||||
|
@ -638,7 +655,7 @@ main (int argc, char **argv)
|
|||
if (!caller_is_admin ())
|
||||
{
|
||||
strcpy (oldpwd, getpass ("Old password: "));
|
||||
if (ChangePW (user, oldpwd, oldpwd, 1, server))
|
||||
if (ChangePW (user, ui->usri3_name, oldpwd, oldpwd, 1, server))
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -647,7 +664,8 @@ main (int argc, char **argv)
|
|||
strcpy (newpwd, getpass ("New password: "));
|
||||
if (strcmp (newpwd, getpass ("Re-enter new password: ")))
|
||||
eprint (0, "Password is not identical.");
|
||||
else if (!ChangePW (user, *oldpwd ? oldpwd : NULL, newpwd, 0, server))
|
||||
else if (!ChangePW (user, ui->usri3_name, *oldpwd ? oldpwd : NULL,
|
||||
newpwd, 0, server))
|
||||
ret = 1;
|
||||
if (!ret && cnt < 2)
|
||||
eprint (0, "Try again.");
|
||||
|
|
Loading…
Reference in New Issue