mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
8.0 KiB
229 lines
8.0 KiB
// BUGBUG: Avoid %ws for UNICODE
|
|
|
|
/*
|
|
NETCNFG.C -- a sample program demonstrating NetConfig API functions.
|
|
|
|
This program requires that you have admin privilege or any
|
|
type of operator privilege on the specified server.
|
|
|
|
usage: netcnfg [-s \\server] [-p parameter] [-c component] [-v value]
|
|
where \\server = Name of the server. A servername must be
|
|
preceded by two backslashes (\\).
|
|
parameter = Name of the LANMAN.INI parameter to get.
|
|
component = Name of the component from which the
|
|
parameter is to be retrieved.
|
|
value = New string value for parameter.
|
|
|
|
API Used to...
|
|
================ ===========================================
|
|
NetConfigGet Retrieve a parameter in the LANMAN.INI file
|
|
on the specified server
|
|
NetConfigGetAll Retrieve complete component info from the
|
|
specified LANMAN.INI file
|
|
NetConfigSet Change or add a parameter in the LANMAN.INI file
|
|
on the specified server
|
|
|
|
This code sample is provided for demonstration purposes only.
|
|
Microsoft makes no warranty, either express or implied,
|
|
as to its usability in any given situation.
|
|
|
|
25-Oct-1991 JohnRo
|
|
Revised from LanMan 2.0 SDK to use NT/LAN APIs, etc.
|
|
30-Oct-1991 JohnRo
|
|
Reduce unnecessary recompiles.
|
|
07-Jan-1992 JohnRo
|
|
Added use of NetConfigSet to test repl stuff. Added -v flag for value.
|
|
14-Jun-1992 JohnRo
|
|
Changed net APIs to UNICODE.
|
|
*/
|
|
|
|
// These must be included first:
|
|
|
|
#ifndef UNICODE
|
|
#define UNICODE // net APIs are only supported in UNICODE.
|
|
#endif
|
|
|
|
#define NOMINMAX // Avoid windows vs. stdlib.h conflicts.
|
|
#include <windef.h> // DWORD, etc.
|
|
#include <lmcons.h> // NET_API_STATUS, etc.
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <lmapibuf.h> // NetApiBufferFree().
|
|
#include <lmconfig.h> // NetConfig APIs and structures.
|
|
#include <lmerr.h> // NERR_ and ERROR_ equates.
|
|
#include "samples.h" // Internal routine header file
|
|
#include <stdio.h> // C run-time header files
|
|
#include <stdlib.h> // EXIT_FAILURE, EXIT_SUCCESS, _CRTAPI1.
|
|
#include <wchar.h> // wcslen().
|
|
|
|
|
|
#define DEFAULT_COMPONENT L"Workstation"
|
|
#define DEFAULT_PARAMETER L"Domain"
|
|
#define SMALL_BUFF 64
|
|
#define BIG_BUFF 4096
|
|
|
|
void Usage (char * pszProgram);
|
|
|
|
int _CRTAPI1
|
|
main(
|
|
int argc,
|
|
char *argv[]
|
|
)
|
|
{
|
|
LPWSTR pszServer = L""; // Server name
|
|
LPWSTR pszComponent = DEFAULT_COMPONENT; // Component to list
|
|
LPWSTR pszParameter = DEFAULT_PARAMETER; // Parameter within component
|
|
LPWSTR pszValue = NULL; // No new value (don't change)
|
|
// char *pszBuffer, *p; // String pointers
|
|
int iCount; // Index counter
|
|
API_RET_TYPE uReturnCode; // API return code
|
|
|
|
LPWSTR BufferW;
|
|
LPWSTR p;
|
|
|
|
for (iCount = 1; iCount < argc; iCount++)
|
|
{
|
|
if ((*argv[iCount] == '-') || (*argv[iCount] == '/'))
|
|
{
|
|
switch (tolower(*(argv[iCount]+1))) // Process switches
|
|
{
|
|
case 's': // -s servername
|
|
pszServer = SafeMallocWStrFromStr( argv[++iCount] );
|
|
break;
|
|
case 'c': // -c component
|
|
pszComponent = SafeMallocWStrFromStr( argv[++iCount] );
|
|
break;
|
|
case 'p': // -p parameter
|
|
pszParameter = SafeMallocWStrFromStr( argv[++iCount] );
|
|
break;
|
|
case 'v': // -v value
|
|
pszValue = SafeMallocWStrFromStr( argv[++iCount] );
|
|
break;
|
|
case 'h':
|
|
default:
|
|
Usage(argv[0]);
|
|
}
|
|
}
|
|
else
|
|
Usage(argv[0]);
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
// NetConfigGet
|
|
//
|
|
// This API retrieves a single entry from the LANMAN.INI file on a
|
|
// specified server. If no servername is given, the local LANMAN.INI
|
|
// file is used. When executed remotely, the user must have admin
|
|
// privilege or at least one operator privilege on the remote server.
|
|
//========================================================================
|
|
|
|
uReturnCode = NetConfigGet(
|
|
pszServer, // Servername
|
|
pszComponent, // Component in LANMAN.INI
|
|
pszParameter, // Parameter in component
|
|
(LPBYTE *) (LPVOID) & BufferW); // Buffer (will be alloc'ed).
|
|
|
|
printf("NetConfigGet returned %lu \n", uReturnCode);
|
|
|
|
if (uReturnCode == NERR_Success)
|
|
{
|
|
printf(" %ws = %ws\n\n", pszParameter, BufferW);
|
|
(void) NetApiBufferFree(BufferW);
|
|
}
|
|
|
|
//========================================================================
|
|
// NetConfigGetAll
|
|
//
|
|
// This API returns information for an entire LANMAN.INI component such
|
|
// as [networks] or [workstation]. The returned information is a
|
|
// sequence of null-terminated strings followed by a null string.
|
|
//========================================================================
|
|
|
|
uReturnCode = NetConfigGetAll(
|
|
pszServer, // Name of remote server
|
|
pszComponent, // Component of LANMAN.INI
|
|
(LPBYTE *) (LPVOID) & BufferW); // Buffer (will be alloc'ed).
|
|
|
|
printf("NetConfigGetAll returned %lu \n", uReturnCode);
|
|
|
|
switch(uReturnCode)
|
|
{
|
|
case NERR_Success: // It worked
|
|
if (BufferW) {
|
|
|
|
p = BufferW;
|
|
while (*p) // While not at null string
|
|
{
|
|
printf(" %ws\n", p); // Print string
|
|
p += (wcslen(p) + 1); // Step past trailing NUL
|
|
}
|
|
(void) NetApiBufferFree( BufferW );
|
|
} else {
|
|
printf( "(no keywords for that component)\n" );
|
|
}
|
|
break;
|
|
case ERROR_BAD_NETPATH:
|
|
printf(" Server %ws not found.\n", pszServer);
|
|
break;
|
|
case NERR_InvalidAPI:
|
|
printf(" The remote server %ws does not support this API.\n",
|
|
pszServer);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
//========================================================================
|
|
// NetConfigSet
|
|
//
|
|
// This API changes the value for a single parameter (keyword) of a
|
|
// single component.
|
|
//========================================================================
|
|
|
|
if (pszValue != NULL) // New value given on command line.
|
|
{
|
|
CONFIG_INFO_0 Info;
|
|
|
|
Info.cfgi0_key = pszParameter;
|
|
Info.cfgi0_data = pszValue;
|
|
|
|
uReturnCode = NetConfigSet(
|
|
pszServer, // Name of remote server
|
|
NULL, // reserved 1
|
|
pszComponent, // Component of LANMAN.INI
|
|
0, // level
|
|
0, // reserved 2
|
|
(LPBYTE) (LPVOID) & Info, // info level 0 struct
|
|
0); // reserved 3
|
|
|
|
printf("NetConfigSet returned %lu \n", uReturnCode);
|
|
|
|
uReturnCode = NetConfigGet(
|
|
pszServer, // Servername
|
|
pszComponent, // Component in LANMAN.INI
|
|
pszParameter, // Parameter in component
|
|
(LPBYTE *) (LPVOID) & BufferW); // Buffer (will be alloc'ed).
|
|
|
|
printf("NetConfigGet returned %lu \n", uReturnCode);
|
|
|
|
if (uReturnCode == NERR_Success)
|
|
{
|
|
printf(" %ws = %ws\n\n", pszParameter, BufferW);
|
|
(void) NetApiBufferFree(BufferW);
|
|
|
|
}
|
|
|
|
}
|
|
return (EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
void Usage (char * pszProgram)
|
|
{
|
|
fprintf(stderr, "NetConfig API sample program (32-bit, Unicode version).\n");
|
|
fprintf(stderr, "Usage: %s [-s \\\\server] [-c component]"
|
|
" [-p parameter] [-v value]\n", pszProgram);
|
|
exit( EXIT_FAILURE );
|
|
}
|