* 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>
|
2014-11-12 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* mkgroup.c (usage): Fix language.
|
* mkgroup.c (usage): Fix language.
|
||||||
|
@ -17,6 +17,7 @@ details. */
|
|||||||
#include <lmerr.h>
|
#include <lmerr.h>
|
||||||
#include <lmcons.h>
|
#include <lmcons.h>
|
||||||
#include <lmapibuf.h>
|
#include <lmapibuf.h>
|
||||||
|
#include <dsgetdc.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -115,7 +116,7 @@ EvalRet (int ret, const char *user)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PUSER_INFO_3
|
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];
|
char usr_buf[UNLEN + 1];
|
||||||
WCHAR name[UNLEN + 1];
|
WCHAR name[UNLEN + 1];
|
||||||
@ -124,7 +125,7 @@ GetPW (char *user, int print_win_name, LPCWSTR server)
|
|||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
char *domain = (char *) alloca (INTERNET_MAX_HOST_NAME_LENGTH + 1);
|
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)))
|
if ((pw = getpwnam (user)))
|
||||||
{
|
{
|
||||||
cygwin_internal (CW_EXTRACT_DOMAIN_AND_USER, pw, domain, usr_buf);
|
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);
|
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);
|
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;
|
return EvalRet (ret, user) ? NULL : ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ChangePW (const char *user, const char *oldpwd, const char *pwd, int justcheck,
|
ChangePW (const char *user, PCWSTR name, const char *oldpwd, const char *pwd,
|
||||||
LPCWSTR server)
|
int justcheck, LPCWSTR server)
|
||||||
{
|
{
|
||||||
WCHAR name[UNLEN + 1], oldpass[512], pass[512];
|
WCHAR oldpass[512], pass[512];
|
||||||
DWORD ret;
|
DWORD ret;
|
||||||
|
|
||||||
mbstowcs (name, user, UNLEN + 1);
|
|
||||||
mbstowcs (pass, pwd, 512);
|
mbstowcs (pass, pwd, 512);
|
||||||
if (!oldpwd)
|
if (!oldpwd)
|
||||||
{
|
{
|
||||||
@ -281,9 +300,7 @@ usage (FILE * stream, int status)
|
|||||||
"\n"
|
"\n"
|
||||||
"Other options:\n"
|
"Other options:\n"
|
||||||
" -d, --logonserver SERVER connect to SERVER (e.g. domain controller).\n"
|
" -d, --logonserver SERVER connect to SERVER (e.g. domain controller).\n"
|
||||||
" Default server is the local system, unless\n"
|
" Usually not required.\n"
|
||||||
" changing the current user, in which case the\n"
|
|
||||||
" default is the content of $LOGONSERVER.\n"
|
|
||||||
" -S, --status display password status for USER (locked, expired,\n"
|
" -S, --status display password status for USER (locked, expired,\n"
|
||||||
" etc.) plus global system password settings.\n"
|
" etc.) plus global system password settings.\n"
|
||||||
" -h, --help output usage information and exit.\n"
|
" -h, --help output usage information and exit.\n"
|
||||||
@ -482,7 +499,7 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'V':
|
case 'V':
|
||||||
case 'v': /* Keep this option for historrical reasons,
|
case 'v': /* Keep this option for historical reasons,
|
||||||
but don't advertize it. */
|
but don't advertize it. */
|
||||||
print_version ();
|
print_version ();
|
||||||
exit (0);
|
exit (0);
|
||||||
@ -590,7 +607,7 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ui = GetPW (user, 1, server);
|
ui = GetPW (user, 1, &server);
|
||||||
if (!ui)
|
if (!ui)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@ -638,7 +655,7 @@ main (int argc, char **argv)
|
|||||||
if (!caller_is_admin ())
|
if (!caller_is_admin ())
|
||||||
{
|
{
|
||||||
strcpy (oldpwd, getpass ("Old password: "));
|
strcpy (oldpwd, getpass ("Old password: "));
|
||||||
if (ChangePW (user, oldpwd, oldpwd, 1, server))
|
if (ChangePW (user, ui->usri3_name, oldpwd, oldpwd, 1, server))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -647,7 +664,8 @@ main (int argc, char **argv)
|
|||||||
strcpy (newpwd, getpass ("New password: "));
|
strcpy (newpwd, getpass ("New password: "));
|
||||||
if (strcmp (newpwd, getpass ("Re-enter new password: ")))
|
if (strcmp (newpwd, getpass ("Re-enter new password: ")))
|
||||||
eprint (0, "Password is not identical.");
|
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;
|
ret = 1;
|
||||||
if (!ret && cnt < 2)
|
if (!ret && cnt < 2)
|
||||||
eprint (0, "Try again.");
|
eprint (0, "Try again.");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user