mirror of https://github.com/tongzx/nt5src
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.
213 lines
5.0 KiB
213 lines
5.0 KiB
/*++
|
|
|
|
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)))) ;
|
|
}
|
|
|