/*++ 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, "", CAN_HAVE_FEWER_ARGUMENTS, "Makes this computer a member of an RFC1510 Kerberos Realm", "requires a reboot to take effect" }, {L"/MapUser", 2, MapUser, " ", CAN_HAVE_FEWER_ARGUMENTS, "Maps a Kerberos Principal ('*' = any principal)\n" "\tto an account ('*' = an account by same name)" }, {L"/AddKdc", 1, AddKdcName, " [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, " [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, " ", 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, " ", 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, "", 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, "", 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, "", 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, " ", 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, " [flag] [flag] [...]", CAN_HAVE_MORE_ARGUMENTS, "Sets RealmFlags for a specific realm" }, { L"/AddRealmFlags", 2, AddRealmFlags, " [flag] [flag] [...]", CAN_HAVE_MORE_ARGUMENTS, "Adds additional RealmFlags to a realm" }, { L"/DelRealmFlags", 2, DelRealmFlags, " [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, "", 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); }