290 lines
7.5 KiB
C++
290 lines
7.5 KiB
C++
/*++
|
|
|
|
MISCCMDS.CXX
|
|
|
|
Copyright (C) 1999 Microsoft Corporation, all rights reserved.
|
|
|
|
DESCRIPTION: miscellaneous command callbacks and the command vector
|
|
|
|
Created, May 21, 1999 by DavidCHR.
|
|
|
|
--*/
|
|
|
|
#include "Everything.hxx"
|
|
|
|
/* these are the callback functions invoked by the option parser.
|
|
We declare them here so that they can be called from the array
|
|
below */
|
|
|
|
TestFunc
|
|
SetDnsDomain, // domain.cxx
|
|
AddKdcName, // servers.cxx
|
|
AddKpasswdName, // servers.cxx
|
|
MapUser, // mapuser.cxx
|
|
SetMachinePassword, // below in this file
|
|
DumpState, // dmpstate.cxx
|
|
ChooseDomain , // domain.cxx
|
|
DeleteKdcName, // servers.cxx
|
|
DelKpasswdName, // servers.cxx
|
|
ChangeViaKpasswd, // support.cxx
|
|
SetRealmFlags, // realmflags.cxx
|
|
AddRealmFlags, // realmflags.cxx
|
|
DelRealmFlags, // realmflags.cxx
|
|
ListRealmFlags, // realmflags.cxx
|
|
RemoveDomainName, // servers.cxx
|
|
PrintHelp; // below in this file
|
|
|
|
|
|
|
|
NTSTATUS
|
|
SetMachinePassword( LPWSTR * Parameter)
|
|
{
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
|
UNICODE_STRING MachinePassword;
|
|
UNICODE_STRING KeyName;
|
|
LPWSTR Password;
|
|
|
|
if ( !ReadOptionallyStarredPassword( Parameter[ 0 ],
|
|
PROMPT_FOR_PASSWORD_TWICE,
|
|
L"new computer",
|
|
&Password ) ) {
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
|
|
|
printf("Setting computer password\n");
|
|
|
|
RtlInitUnicodeString(
|
|
&MachinePassword,
|
|
Password
|
|
);
|
|
|
|
RtlInitUnicodeString(
|
|
&KeyName,
|
|
L"$MACHINE.ACC"
|
|
);
|
|
|
|
Status = LsaStorePrivateData(
|
|
LsaHandle,
|
|
&KeyName,
|
|
&MachinePassword
|
|
);
|
|
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
printf("Failed to set machine password: 0x%x\n",Status);
|
|
}
|
|
|
|
free( Password );
|
|
|
|
|
|
return(Status);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
SetServer(LPWSTR * Parameter)
|
|
{
|
|
printf("Targeting server %ws\n",Parameter[0]);
|
|
wcscpy(ServerBuffer,Parameter[0]);
|
|
ServerName = ServerBuffer;
|
|
return(STATUS_SUCCESS);
|
|
}
|
|
|
|
#if DBG /* This function and its corresponding variable
|
|
are only useful on debug builds. */
|
|
|
|
ULONG GlobalDebugFlags = ~DEBUG_OPTIONS;
|
|
|
|
NTSTATUS
|
|
SetDebugFlags( LPWSTR *Params ) {
|
|
|
|
ASSERT( *Params != NULL );
|
|
GlobalDebugFlags = wcstoul( *Params,
|
|
0,
|
|
NULL );
|
|
|
|
printf( "Debug Print Flags set to 0x%x.\n",
|
|
GlobalDebugFlags );
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
#endif
|
|
|
|
|
|
/*------------------------------------------------------------
|
|
|
|
Here's the array of callbacks. It's read by the command
|
|
line interpreter in main()
|
|
|
|
------------------------------------------------------------*/
|
|
|
|
CommandPair Commands[] = {
|
|
|
|
// argument argc doNow? argFunction description
|
|
|
|
{L"/SetDomain", 1, SetDnsDomain, NULL, // renamed -- hidden from help
|
|
0,
|
|
NULL, // no arguments
|
|
"requires a reboot to take effect" },
|
|
|
|
{L"/SetRealm", 1, SetDnsDomain, "<DnsDomainName>",
|
|
CAN_HAVE_FEWER_ARGUMENTS,
|
|
"Makes this computer a member of an RFC1510 Kerberos Realm",
|
|
"requires a reboot to take effect" },
|
|
|
|
{L"/MapUser", 2, MapUser, "<Principal> <Account>",
|
|
CAN_HAVE_FEWER_ARGUMENTS,
|
|
"Maps a Kerberos Principal ('*' = any principal)\n"
|
|
"\tto an account ('*' = an account by same name)"
|
|
},
|
|
|
|
{L"/AddKdc", 1, AddKdcName, "<RealmName> [KdcName]",
|
|
CAN_HAVE_MORE_ARGUMENTS,
|
|
"Defines a KDC entry for the given realm.\n"
|
|
"\tIf KdcName omitted, DNS may be used to locate KDCs.",
|
|
"requires a reboot to take effect on pre-SP1 Win2000 computers" },
|
|
|
|
{L"/DelKdc", 1, DeleteKdcName, "<RealmName> [KdcName]",
|
|
CAN_HAVE_MORE_ARGUMENTS,
|
|
"deletes a KDC entry for the realm.\n"
|
|
"\tIf KdcName omitted, the realm entry itself is deleted.",
|
|
"requires a reboot to take effect on pre-SP1 Win2000 computers" },
|
|
|
|
{L"/AddKpasswd", 2, AddKpasswdName, "<Realmname> <KpasswdName>",
|
|
0, // no flags
|
|
"Add Kpasswd server address for a realm",
|
|
"requires a reboot to take effect on pre-SP1 Win2000 computers" },
|
|
|
|
{L"/DelKpasswd", 2, DelKpasswdName, "<Realmname> <KpasswdName>",
|
|
0, // no flags
|
|
"Delete Kpasswd server address for a realm",
|
|
"requires a reboot to take effect on pre-SP1 Win2000 computers" },
|
|
|
|
{L"/Server", 1, SetServer, "<Servername>",
|
|
DO_COMMAND_IMMEDIATELY,
|
|
"specify name of a Windows machine to target the changes."
|
|
},
|
|
|
|
{L"/SetMachPassword", 1, SetMachinePassword, NULL, // renamed; hidden from help
|
|
0, // no flags
|
|
NULL, // no description -- this option is depricated.
|
|
"requires a reboot to take effect." },
|
|
|
|
{L"/SetComputerPassword", 1, SetMachinePassword, "<Password>",
|
|
0, // no flags
|
|
"Sets the password for the computer's domain account\n"
|
|
"\t(or \"host\" principal)",
|
|
"requires a reboot to take effect." },
|
|
|
|
{ L"/RemoveRealm", 1, RemoveDomainName, "<RealmName>",
|
|
0, // no flags
|
|
"delete all information for this realm from the registry.",
|
|
"requires a reboot to take effect on pre-SP1 Win2000 computers" },
|
|
|
|
{L"/Domain", 1, ChooseDomain, "[DomainName]",
|
|
DO_COMMAND_IMMEDIATELY |
|
|
CAN_HAVE_FEWER_ARGUMENTS,
|
|
"use this domain (if DomainName is unspecified, detect it)" },
|
|
|
|
{L"/ChangePassword", 2, ChangeViaKpasswd, "<OldPasswd> <NewPasswd>",
|
|
DO_COMMAND_IMMEDIATELY,
|
|
"Use Kpasswd to change the logged-on user's password.\n"
|
|
"\tUse '*' to be prompted for passwords." },
|
|
|
|
// realm flag stuff:
|
|
|
|
{ L"/ListRealmFlags", 0, ListRealmFlags,
|
|
"(no args)",
|
|
DO_COMMAND_IMMEDIATELY,
|
|
"Lists the available Realm flags that ksetup knows"
|
|
},
|
|
|
|
{ L"/SetRealmFlags", 2, SetRealmFlags,
|
|
"<realm> <flag> [flag] [flag] [...]",
|
|
CAN_HAVE_MORE_ARGUMENTS,
|
|
"Sets RealmFlags for a specific realm" },
|
|
|
|
{ L"/AddRealmFlags", 2, AddRealmFlags,
|
|
"<realm> <flag> [flag] [flag] [...]",
|
|
CAN_HAVE_MORE_ARGUMENTS,
|
|
"Adds additional RealmFlags to a realm"
|
|
},
|
|
|
|
{ L"/DelRealmFlags", 2, DelRealmFlags,
|
|
"<realm> <flag> [flag] [flag] [...]",
|
|
CAN_HAVE_MORE_ARGUMENTS,
|
|
"Deletes RealmFlags from a realm." },
|
|
|
|
{L"/DumpState", 0, DumpState,
|
|
"(no args)",
|
|
0,
|
|
"Analyze the kerberos configuration on the given machine." },
|
|
|
|
{L"/?", 0, PrintHelp, NULL }, // hidden from help
|
|
{L"/help", 0, PrintHelp, NULL }, // hidden from help
|
|
|
|
#if DBG
|
|
{L"/debugflag", 1, SetDebugFlags, "<flags>",
|
|
DO_COMMAND_IMMEDIATELY,
|
|
"Set debugging flags" },
|
|
#endif
|
|
|
|
};
|
|
|
|
ULONG cCommands = sizeof( Commands ) / sizeof( Commands[ 0 ] );
|
|
|
|
NTSTATUS
|
|
PrintHelp(LPWSTR * Parameter)
|
|
{
|
|
|
|
ULONG i;
|
|
LPSTR pDesc;
|
|
|
|
printf( "\n"
|
|
"USAGE:\n" );
|
|
|
|
for ( i = 0 ;
|
|
i < cCommands ;
|
|
i ++ ) {
|
|
|
|
if ( Commands[ i ].Arguments ) {
|
|
|
|
printf( "%ws %hs\n",
|
|
Commands[ i ].Name,
|
|
Commands[ i ].Arguments );
|
|
|
|
#if 1
|
|
if ( Commands[ i ].ExtendedDescription ) {
|
|
|
|
printf( "\t%hs\n",
|
|
Commands[ i ].ExtendedDescription );
|
|
|
|
}
|
|
#else
|
|
|
|
for ( pDesc = Commands[ i ].ExtendedDescription;
|
|
pDesc && *pDesc ;
|
|
/* No increment */
|
|
) {
|
|
|
|
printf( "%-20hs %hs\n",
|
|
"",
|
|
pDesc );
|
|
|
|
pDesc = strchr( pDesc, '\0' );
|
|
if ( pDesc ) pDesc++;
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
}
|
|
|
|
return(STATUS_SUCCESS);
|
|
}
|
|
|