windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/srvsvc/server/sess.c

293 lines
5.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991-1992 Microsoft Corporation
Module Name:
Sess.c
Abstract:
This module contains support for the Session catagory of APIs for the
NT server service.
Author:
David Treadwell (davidtr) 30-Jan-1991
Revision History:
--*/
#include "srvsvcp.h"
#include <lmerr.h>
NET_API_STATUS NET_API_FUNCTION
NetrSessionDel (
IN LPTSTR ServerName,
IN LPTSTR ClientName OPTIONAL,
IN LPTSTR UserName OPTIONAL
)
/*++
Routine Description:
This routine communicates with the server FSD to implement the
NetSessionDel function.
Arguments:
None.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
NET_API_STATUS error;
PSERVER_REQUEST_PACKET srp;
ServerName;
//
// Make sure that the caller has the access necessary for this
// operation.
//
error = SsCheckAccess(
&SsSessionSecurityObject,
SRVSVC_SESSION_DELETE
);
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
//
// Translate zero-length strings to NULL pointers.
//
if ( (ClientName != NULL) && (*ClientName == L'\0') ) {
ClientName = NULL;
}
if ( (UserName != NULL) && (*UserName == L'\0') ) {
UserName = NULL;
}
//
// Either the client name or the user name must be specified. It
// is not legal to leave both NULL, as this would imply "log out all
// users." If that's what you want, stop the server.
//
if ( ClientName == NULL && UserName == NULL ) {
return ERROR_INVALID_PARAMETER;
}
//
// Set up the request packet.
//
srp = SsAllocateSrp( );
if ( srp == NULL ) {
return ERROR_NOT_ENOUGH_MEMORY;
}
RtlInitUnicodeString( &srp->Name1, ClientName );
RtlInitUnicodeString( &srp->Name2, UserName );
//
// Simply send the request on to the server.
//
error = SsServerFsControl( FSCTL_SRV_NET_SESSION_DEL, srp, NULL, 0 );
SsFreeSrp( srp );
return error;
} // NetrSessionDel
NET_API_STATUS NET_API_FUNCTION
NetrSessionEnum (
IN LPTSTR ServerName,
IN LPTSTR ClientName OPTIONAL,
IN LPTSTR UserName OPTIONAL,
OUT PSESSION_ENUM_STRUCT InfoStruct,
IN DWORD PreferredMaximumLength,
OUT LPDWORD TotalEntries,
IN OUT LPDWORD ResumeHandle OPTIONAL
)
/*++
Routine Description:
This routine communicates with the server FSD to implement the
NetSessionEnum function.
Arguments:
None.
Return Value:
NET_API_STATUS - NO_ERROR or reason for failure.
--*/
{
NET_API_STATUS error;
PSERVER_REQUEST_PACKET srp;
ACCESS_MASK desiredAccess;
ServerName;
//
// Make sure we have basic sanity on our input parameters
//
if( !ARGUMENT_PRESENT( InfoStruct ) ||
InfoStruct->SessionInfo.Level2 == NULL ||
InfoStruct->SessionInfo.Level2->Buffer != NULL ) {
return ERROR_INVALID_PARAMETER;
}
//
// Make sure that the level is valid and determine the access
// necessary for the level.
//
switch ( InfoStruct->Level ) {
case 0:
case 10:
desiredAccess = SRVSVC_SESSION_USER_INFO_GET;
break;
case 1:
case 2:
case 502:
desiredAccess = SRVSVC_SESSION_ADMIN_INFO_GET;
break;
default:
return ERROR_INVALID_LEVEL;
}
//
// Make sure that the caller has the access necessary for this
// operation.
//
error = SsCheckAccess(
&SsSessionSecurityObject,
desiredAccess
);
if ( error != NO_ERROR ) {
return ERROR_ACCESS_DENIED;
}
//
// Translate zero-length strings to NULL pointers.
//
if ( (ClientName != NULL) && (*ClientName == L'\0') ) {
ClientName = NULL;
}
if ( (UserName != NULL) && (*UserName == L'\0') ) {
UserName = NULL;
}
//
// Is a client name was specified, make sure client name starts with "\\"
//
if ( ARGUMENT_PRESENT( ClientName ) &&
(ClientName[0] != L'\\' || ClientName[1] != L'\\' ) ) {
return(NERR_InvalidComputer);
}
//
// Set up the input parameters in the request buffer.
//
srp = SsAllocateSrp( );
if ( srp == NULL ) {
return ERROR_NOT_ENOUGH_MEMORY;
}
srp->Level = InfoStruct->Level;
RtlInitUnicodeString( &srp->Name1, ClientName );
RtlInitUnicodeString( &srp->Name2, UserName );
if ( ARGUMENT_PRESENT( ResumeHandle ) ) {
srp->Parameters.Get.ResumeHandle = *ResumeHandle;
} else {
srp->Parameters.Get.ResumeHandle = 0;
}
//
// Get the data from the server. This routine will allocate the
// return buffer and handle the case where PreferredMaximumLength ==
// -1.
//
error = SsServerFsControlGetInfo(
FSCTL_SRV_NET_SESSION_ENUM,
srp,
(PVOID *)&InfoStruct->SessionInfo.Level2->Buffer,
PreferredMaximumLength
);
//
// Set up return information.
//
InfoStruct->SessionInfo.Level2->EntriesRead =
srp->Parameters.Get.EntriesRead;
if ( ARGUMENT_PRESENT( TotalEntries ) ) {
*TotalEntries = srp->Parameters.Get.TotalEntries;
}
if ( srp->Parameters.Get.EntriesRead > 0 ) {
if ( ARGUMENT_PRESENT( ResumeHandle ) ) {
*ResumeHandle = srp->Parameters.Get.ResumeHandle;
}
} else if ( *TotalEntries == 0 ) {
//
// Entries read and total entries is 0. If a client name or
// username was specified, return the appropriate error.
//
if ( ARGUMENT_PRESENT( UserName ) ) {
error = NERR_UserNotFound;
} else if ( ARGUMENT_PRESENT( ClientName ) ) {
error = NERR_ClientNameNotFound;
}
}
SsFreeSrp( srp );
return error;
} // NetrSessionEnum