390 lines
9.2 KiB
C
390 lines
9.2 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991-1992 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
wslsa.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the interfaces to the Local Security Authority
|
|||
|
MS V 1.0 authentication package.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Rita Wong (ritaw) 15-May-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#include "wsutil.h"
|
|||
|
#include "wslsa.h"
|
|||
|
#include "winreg.h"
|
|||
|
|
|||
|
//-------------------------------------------------------------------//
|
|||
|
// //
|
|||
|
// Global variables //
|
|||
|
// //
|
|||
|
//-------------------------------------------------------------------//
|
|||
|
|
|||
|
STATIC HANDLE LsaHandle = NULL;
|
|||
|
STATIC ULONG AuthPackageId = 0;
|
|||
|
|
|||
|
#define FULL_LSA_CONTROL_REGISTRY_PATH L"SYSTEM\\CurrentControlSet\\Control\\Lsa"
|
|||
|
#define LSA_RESTRICT_ANONYMOUS_VALUE_NAME L"RestrictAnonymous"
|
|||
|
|
|||
|
DWORD WsLsaRestrictAnonymous = 0;
|
|||
|
|
|||
|
|
|||
|
NET_API_STATUS
|
|||
|
WsInitializeLsa(
|
|||
|
VOID
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function registers the Workstation service as a logon process and
|
|||
|
gets a handle to the MS V1.0 authentication package.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NET_API_STATUS - NERR_Success or reason for failing.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
|
|||
|
NTSTATUS ntstatus;
|
|||
|
|
|||
|
STRING InputString;
|
|||
|
LSA_OPERATIONAL_MODE SecurityMode = 0;
|
|||
|
|
|||
|
//
|
|||
|
// Register the Workstation service as a logon process
|
|||
|
//
|
|||
|
RtlInitString(&InputString, "LAN Manager Workstation Service");
|
|||
|
|
|||
|
ntstatus = LsaRegisterLogonProcess(
|
|||
|
&InputString,
|
|||
|
&LsaHandle,
|
|||
|
&SecurityMode
|
|||
|
);
|
|||
|
|
|||
|
IF_DEBUG(INFO) {
|
|||
|
NetpKdPrint(("[Wksta] LsaRegisterLogonProcess returns x%08lx, "
|
|||
|
"SecurityMode=x%08lx\n", ntstatus, SecurityMode));
|
|||
|
}
|
|||
|
|
|||
|
if (! NT_SUCCESS(ntstatus)) {
|
|||
|
return WsMapStatus(ntstatus);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Look up the MS V1.0 authentication package
|
|||
|
//
|
|||
|
RtlInitString(&InputString,
|
|||
|
"MICROSOFT_AUTHENTICATION_PACKAGE_V1_0");
|
|||
|
|
|||
|
ntstatus = LsaLookupAuthenticationPackage(
|
|||
|
LsaHandle,
|
|||
|
&InputString,
|
|||
|
&AuthPackageId
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
if (! NT_SUCCESS(ntstatus)) {
|
|||
|
|
|||
|
IF_DEBUG(INFO) {
|
|||
|
NetpKdPrint(("[Wksta] LsaLookupAuthenticationPackage returns x%08lx, "
|
|||
|
"AuthPackageId=%lu\n", ntstatus, AuthPackageId));
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
WsLsaRestrictAnonymous = 0;
|
|||
|
|
|||
|
if (NT_SUCCESS(ntstatus)) {
|
|||
|
HKEY handle;
|
|||
|
DWORD error;
|
|||
|
|
|||
|
error = RegOpenKeyEx(
|
|||
|
HKEY_LOCAL_MACHINE,
|
|||
|
FULL_LSA_CONTROL_REGISTRY_PATH,
|
|||
|
0,
|
|||
|
KEY_READ,
|
|||
|
&handle
|
|||
|
);
|
|||
|
|
|||
|
if( error == ERROR_SUCCESS ) {
|
|||
|
DWORD type;
|
|||
|
DWORD size = sizeof( WsLsaRestrictAnonymous );
|
|||
|
|
|||
|
error = RegQueryValueEx(
|
|||
|
handle,
|
|||
|
LSA_RESTRICT_ANONYMOUS_VALUE_NAME,
|
|||
|
NULL,
|
|||
|
&type,
|
|||
|
(LPBYTE)&WsLsaRestrictAnonymous,
|
|||
|
&size);
|
|||
|
|
|||
|
if ((error != ERROR_SUCCESS) ||
|
|||
|
(type != REG_DWORD) ||
|
|||
|
(size != sizeof(DWORD))) {
|
|||
|
WsLsaRestrictAnonymous = 0;
|
|||
|
}
|
|||
|
|
|||
|
RegCloseKey(handle);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return WsMapStatus(ntstatus);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
WsShutdownLsa(
|
|||
|
VOID
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function deregisters the Workstation service as a logon process.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
(void) LsaDeregisterLogonProcess(
|
|||
|
LsaHandle
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NET_API_STATUS
|
|||
|
WsLsaEnumUsers(
|
|||
|
OUT LPBYTE *EnumUsersResponse
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function asks the MS V1.0 Authentication Package to list all users
|
|||
|
who are physically logged on to the local computer.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
EnumUsersResponse - Returns a pointer to a list of user logon ids. This
|
|||
|
memory is allocated by the authentication package and must be freed
|
|||
|
with LsaFreeReturnBuffer when done with it.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NET_API_STATUS - NERR_Success or reason for failure.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
NTSTATUS ntstatus;
|
|||
|
NTSTATUS AuthPackageStatus;
|
|||
|
|
|||
|
MSV1_0_ENUMUSERS_REQUEST EnumUsersRequest;
|
|||
|
ULONG EnumUsersResponseLength;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Ask authentication package to enumerate users who are physically
|
|||
|
// logged to the local machine.
|
|||
|
//
|
|||
|
EnumUsersRequest.MessageType = MsV1_0EnumerateUsers;
|
|||
|
|
|||
|
ntstatus = LsaCallAuthenticationPackage(
|
|||
|
LsaHandle,
|
|||
|
AuthPackageId,
|
|||
|
&EnumUsersRequest,
|
|||
|
sizeof(MSV1_0_ENUMUSERS_REQUEST),
|
|||
|
(PVOID *)EnumUsersResponse,
|
|||
|
&EnumUsersResponseLength,
|
|||
|
&AuthPackageStatus
|
|||
|
);
|
|||
|
|
|||
|
if (ntstatus == STATUS_SUCCESS) {
|
|||
|
ntstatus = AuthPackageStatus;
|
|||
|
}
|
|||
|
|
|||
|
if (ntstatus != STATUS_SUCCESS) {
|
|||
|
return WsMapStatus(ntstatus);
|
|||
|
}
|
|||
|
|
|||
|
return(NERR_Success);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NET_API_STATUS
|
|||
|
WsLsaGetUserInfo(
|
|||
|
IN PLUID LogonId,
|
|||
|
OUT LPBYTE *UserInfoResponse,
|
|||
|
OUT LPDWORD UserInfoResponseLength
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function asks the MS V1.0 Authentication Package for information on
|
|||
|
a specific user.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
LogonId - Supplies the logon id of the user we want information about.
|
|||
|
|
|||
|
UserInfoResponse - Returns a pointer to a structure of information about
|
|||
|
the user. This memory is allocated by the authentication package
|
|||
|
and must be freed with LsaFreeReturnBuffer when done with it.
|
|||
|
|
|||
|
UserInfoResponseLength - Returns the length of the returned information
|
|||
|
in number of bytes.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NET_API_STATUS - NERR_Success or reason for failure.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
NTSTATUS ntstatus;
|
|||
|
NTSTATUS AuthPackageStatus;
|
|||
|
|
|||
|
MSV1_0_GETUSERINFO_REQUEST UserInfoRequest;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Ask authentication package for user information.
|
|||
|
//
|
|||
|
UserInfoRequest.MessageType = MsV1_0GetUserInfo;
|
|||
|
RtlCopyLuid(&UserInfoRequest.LogonId, LogonId);
|
|||
|
|
|||
|
ntstatus = LsaCallAuthenticationPackage(
|
|||
|
LsaHandle,
|
|||
|
AuthPackageId,
|
|||
|
&UserInfoRequest,
|
|||
|
sizeof(MSV1_0_GETUSERINFO_REQUEST),
|
|||
|
(PVOID *)UserInfoResponse,
|
|||
|
UserInfoResponseLength,
|
|||
|
&AuthPackageStatus
|
|||
|
);
|
|||
|
|
|||
|
if (ntstatus == STATUS_SUCCESS) {
|
|||
|
ntstatus = AuthPackageStatus;
|
|||
|
}
|
|||
|
|
|||
|
if (ntstatus != STATUS_SUCCESS) {
|
|||
|
return WsMapStatus(ntstatus);
|
|||
|
}
|
|||
|
|
|||
|
return(NERR_Success);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NET_API_STATUS
|
|||
|
WsLsaRelogonUsers(
|
|||
|
IN LPTSTR LogonServer
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function asks the MS V1.0 Authentication Package to relogon users
|
|||
|
that are logged on by the specified logon server. This is because the
|
|||
|
server had been reset and need to restore the database of users logged
|
|||
|
on by it before it went down.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
LogonServer - Name of logon server which requests that all its previously
|
|||
|
logged on users be relogged on.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NET_API_STATUS - NERR_Success or reason for failure.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
NTSTATUS ntstatus;
|
|||
|
NTSTATUS AuthPackageStatus;
|
|||
|
|
|||
|
OEM_STRING AnsiLogonServerName;
|
|||
|
|
|||
|
PMSV1_0_RELOGON_REQUEST RelogonUsersRequest;
|
|||
|
ULONG RelogonUsersRequestLength = sizeof(MSV1_0_RELOGON_REQUEST) +
|
|||
|
(STRLEN(LogonServer) + 1) * sizeof(WCHAR);
|
|||
|
|
|||
|
//
|
|||
|
// NTRAID-70701-2/6/2000 davey Since we cannot yet use optional parameters in call to
|
|||
|
// LsaCallAuthentication package, provide these variables for now.
|
|||
|
//
|
|||
|
PVOID RelogonUsersResponse;
|
|||
|
ULONG ResponseLength;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Allocate the relogon request package dynamically because the logon
|
|||
|
// server name length is dynamic
|
|||
|
//
|
|||
|
if ((RelogonUsersRequest = (PMSV1_0_RELOGON_REQUEST)
|
|||
|
LocalAlloc(
|
|||
|
LMEM_ZEROINIT,
|
|||
|
(UINT) RelogonUsersRequestLength
|
|||
|
)) == NULL) {
|
|||
|
return GetLastError();
|
|||
|
}
|
|||
|
|
|||
|
RelogonUsersRequest->LogonServer.Buffer = (LPWSTR)
|
|||
|
((DWORD_PTR) RelogonUsersRequest) +
|
|||
|
sizeof(MSV1_0_RELOGON_REQUEST);
|
|||
|
|
|||
|
RtlInitUnicodeString(&RelogonUsersRequest->LogonServer, LogonServer);
|
|||
|
|
|||
|
//
|
|||
|
// Ask authentication package to relogon users for the specified
|
|||
|
// logon server.
|
|||
|
//
|
|||
|
RelogonUsersRequest->MessageType = MsV1_0ReLogonUsers;
|
|||
|
|
|||
|
ntstatus = LsaCallAuthenticationPackage(
|
|||
|
LsaHandle,
|
|||
|
AuthPackageId,
|
|||
|
&RelogonUsersRequest,
|
|||
|
RelogonUsersRequestLength,
|
|||
|
&RelogonUsersResponse, // should be NULL if OPTIONAL
|
|||
|
&ResponseLength, // should be NULL if OPTIONAL
|
|||
|
&AuthPackageStatus
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Free memory allocated for request package
|
|||
|
//
|
|||
|
(void) LocalFree(RelogonUsersRequest);
|
|||
|
|
|||
|
if (ntstatus == STATUS_SUCCESS) {
|
|||
|
ntstatus = AuthPackageStatus;
|
|||
|
}
|
|||
|
|
|||
|
if (ntstatus != STATUS_SUCCESS) {
|
|||
|
return WsMapStatus(ntstatus);
|
|||
|
}
|
|||
|
|
|||
|
return(NERR_Success);
|
|||
|
}
|
|||
|
|