214 lines
5 KiB
C
214 lines
5 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1993-1993 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
nwsutil.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements IsNetWareInstalled()
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Congpa You (CongpaY) 02-Dec-1993 Crested
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "nt.h"
|
||
|
#include "ntrtl.h"
|
||
|
#include "nturtl.h"
|
||
|
|
||
|
#include "windef.h"
|
||
|
#include "winerror.h"
|
||
|
#include "winbase.h"
|
||
|
|
||
|
#include "ntlsa.h"
|
||
|
#include "nwsutil.h"
|
||
|
#include "crypt.h"
|
||
|
|
||
|
#include <fpnwcomm.h>
|
||
|
#include <usrprop.h>
|
||
|
|
||
|
NTSTATUS
|
||
|
GetRemoteNcpSecretKey (
|
||
|
PUNICODE_STRING SystemName,
|
||
|
CHAR *pchNWSecretKey
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// this function returns the FPNW LSA Secret for the specified domain
|
||
|
//
|
||
|
|
||
|
NTSTATUS ntstatus;
|
||
|
OBJECT_ATTRIBUTES ObjAttributes;
|
||
|
LSA_HANDLE PolicyHandle = NULL;
|
||
|
LSA_HANDLE SecretHandle = NULL;
|
||
|
UNICODE_STRING SecretNameString;
|
||
|
PUNICODE_STRING punicodeCurrentValue;
|
||
|
PUNICODE_STRING punicodeOldValue;
|
||
|
|
||
|
InitializeObjectAttributes( &ObjAttributes,
|
||
|
NULL,
|
||
|
0L,
|
||
|
NULL,
|
||
|
NULL );
|
||
|
|
||
|
ntstatus = LsaOpenPolicy( SystemName,
|
||
|
&ObjAttributes,
|
||
|
POLICY_CREATE_SECRET,
|
||
|
&PolicyHandle );
|
||
|
|
||
|
if ( !NT_SUCCESS( ntstatus ))
|
||
|
{
|
||
|
return( ntstatus );
|
||
|
}
|
||
|
|
||
|
RtlInitUnicodeString( &SecretNameString, NCP_LSA_SECRET_KEY );
|
||
|
|
||
|
ntstatus = LsaOpenSecret( PolicyHandle,
|
||
|
&SecretNameString,
|
||
|
SECRET_QUERY_VALUE,
|
||
|
&SecretHandle );
|
||
|
|
||
|
if ( !NT_SUCCESS( ntstatus ))
|
||
|
{
|
||
|
LsaClose( PolicyHandle );
|
||
|
return( ntstatus );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Do not need the policy handle anymore.
|
||
|
//
|
||
|
|
||
|
LsaClose( PolicyHandle );
|
||
|
|
||
|
ntstatus = LsaQuerySecret( SecretHandle,
|
||
|
&punicodeCurrentValue,
|
||
|
NULL,
|
||
|
&punicodeOldValue,
|
||
|
NULL );
|
||
|
|
||
|
//
|
||
|
// Do not need the secret handle anymore.
|
||
|
//
|
||
|
|
||
|
LsaClose( SecretHandle );
|
||
|
|
||
|
if ( NT_SUCCESS(ntstatus) && ( punicodeCurrentValue->Buffer != NULL))
|
||
|
{
|
||
|
memcpy( pchNWSecretKey,
|
||
|
punicodeCurrentValue->Buffer,
|
||
|
min(punicodeCurrentValue->Length, USER_SESSION_KEY_LENGTH));
|
||
|
}
|
||
|
|
||
|
LsaFreeMemory( punicodeCurrentValue );
|
||
|
LsaFreeMemory( punicodeOldValue );
|
||
|
|
||
|
return( ntstatus );
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
GetNcpSecretKey (
|
||
|
CHAR *pchNWSecretKey
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// simply return the LSA Secret for the local domain
|
||
|
//
|
||
|
|
||
|
return GetRemoteNcpSecretKey( NULL, pchNWSecretKey );
|
||
|
}
|
||
|
|
||
|
BOOL IsNetWareInstalled( VOID )
|
||
|
{
|
||
|
CHAR pszNWSecretKey[USER_SESSION_KEY_LENGTH];
|
||
|
|
||
|
return( !NT_SUCCESS( GetNcpSecretKey (pszNWSecretKey))
|
||
|
? FALSE
|
||
|
: (pszNWSecretKey[0] != 0));
|
||
|
}
|
||
|
|
||
|
NTSTATUS InstallNetWare( LPWSTR lpNcpSecretKey )
|
||
|
{
|
||
|
NTSTATUS ntstatus;
|
||
|
OBJECT_ATTRIBUTES ObjAttributes;
|
||
|
LSA_HANDLE PolicyHandle;
|
||
|
LSA_HANDLE SecretHandle;
|
||
|
UNICODE_STRING SecretNameString;
|
||
|
UNICODE_STRING unicodeCurrentValue;
|
||
|
UNICODE_STRING unicodeOldValue;
|
||
|
|
||
|
InitializeObjectAttributes( &ObjAttributes,
|
||
|
NULL,
|
||
|
0L,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
|
||
|
ntstatus = LsaOpenPolicy( NULL,
|
||
|
&ObjAttributes,
|
||
|
POLICY_CREATE_SECRET,
|
||
|
&PolicyHandle );
|
||
|
|
||
|
if ( !NT_SUCCESS( ntstatus ))
|
||
|
{
|
||
|
return( ntstatus );
|
||
|
}
|
||
|
|
||
|
RtlInitUnicodeString( &SecretNameString, NCP_LSA_SECRET_KEY );
|
||
|
|
||
|
ntstatus = LsaCreateSecret( PolicyHandle,
|
||
|
&SecretNameString,
|
||
|
SECRET_SET_VALUE | DELETE,
|
||
|
&SecretHandle );
|
||
|
|
||
|
if ( ntstatus == STATUS_OBJECT_NAME_COLLISION )
|
||
|
{
|
||
|
ntstatus = LsaOpenSecret( PolicyHandle,
|
||
|
&SecretNameString,
|
||
|
SECRET_SET_VALUE,
|
||
|
&SecretHandle );
|
||
|
}
|
||
|
|
||
|
if ( NT_SUCCESS( ntstatus ))
|
||
|
{
|
||
|
RtlInitUnicodeString( &unicodeOldValue, NULL );
|
||
|
RtlInitUnicodeString( &unicodeCurrentValue, lpNcpSecretKey );
|
||
|
|
||
|
ntstatus = LsaSetSecret( SecretHandle,
|
||
|
&unicodeCurrentValue,
|
||
|
&unicodeOldValue );
|
||
|
|
||
|
LsaClose( SecretHandle );
|
||
|
}
|
||
|
|
||
|
LsaClose( PolicyHandle );
|
||
|
|
||
|
return( ntstatus );
|
||
|
}
|
||
|
|
||
|
ULONG
|
||
|
MapRidToObjectId(
|
||
|
DWORD dwRid,
|
||
|
LPWSTR pszUserName,
|
||
|
BOOL fNTAS,
|
||
|
BOOL fBuiltin )
|
||
|
{
|
||
|
(void) fBuiltin ; // unused for now.
|
||
|
|
||
|
if (pszUserName && (lstrcmpi(pszUserName, SUPERVISOR_NAME_STRING)==0))
|
||
|
return SUPERVISOR_USERID ;
|
||
|
|
||
|
return ( fNTAS ? (dwRid | 0x10000000) : dwRid ) ;
|
||
|
}
|
||
|
|
||
|
|
||
|
ULONG SwapObjectId( ULONG ulObjectId )
|
||
|
{
|
||
|
return (MAKELONG(HIWORD(ulObjectId),SWAPWORD(LOWORD(ulObjectId)))) ;
|
||
|
}
|
||
|
|