280 lines
6.4 KiB
C++
280 lines
6.4 KiB
C++
|
#include <windows.h>
|
||
|
#include <shellapi.h>
|
||
|
#include <stdio.h>
|
||
|
#include <tchar.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <rpc.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <crt/io.h>
|
||
|
#include <wincrypt.h>
|
||
|
#include <winsta.h>
|
||
|
#include <license.h>
|
||
|
|
||
|
|
||
|
|
||
|
/*****************************************************************************
|
||
|
*
|
||
|
* MIDL_user_allocate
|
||
|
*
|
||
|
* Handles RPC's allocation of argument data structures
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* Param1 (input/output)
|
||
|
* Comments
|
||
|
*
|
||
|
* EXIT:
|
||
|
* ERROR_SUCCESS - no error
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
extern "C" void __RPC_FAR * __RPC_USER
|
||
|
midl_user_allocate(
|
||
|
size_t Size
|
||
|
)
|
||
|
{
|
||
|
return( LocalAlloc(LMEM_FIXED,Size) );
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
*
|
||
|
* MIDL_user_free
|
||
|
*
|
||
|
* Handles RPC's de-allocation of argument data structures
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* Param1 (input/output)
|
||
|
* Comments
|
||
|
*
|
||
|
* EXIT:
|
||
|
* ERROR_SUCCESS - no error
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
void __RPC_USER
|
||
|
midl_user_free(
|
||
|
void __RPC_FAR *p
|
||
|
)
|
||
|
{
|
||
|
LocalFree( p );
|
||
|
}
|
||
|
|
||
|
void MyReportError(DWORD errCode)
|
||
|
{
|
||
|
DWORD dwRet;
|
||
|
LPTSTR lpszTemp = NULL;
|
||
|
|
||
|
dwRet=FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
||
|
NULL,
|
||
|
errCode,
|
||
|
LANG_NEUTRAL,
|
||
|
(LPTSTR)&lpszTemp,
|
||
|
0,
|
||
|
NULL);
|
||
|
|
||
|
if(dwRet != 0)
|
||
|
{
|
||
|
_tprintf(_TEXT("Error : %s (%d)\n"), lpszTemp, errCode);
|
||
|
if(lpszTemp)
|
||
|
LocalFree((HLOCAL)lpszTemp);
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void Usage(char * szName)
|
||
|
{
|
||
|
wprintf(L"Usage: %S\n"
|
||
|
L"\t-s <mode> - Set licensing mode\n"
|
||
|
L"\t-g - Get licensing mode\n"
|
||
|
L"\t-l - List available licensing modes\n"
|
||
|
L"\t-i <mode> - Get information about licensing mode\n"
|
||
|
L"\n"
|
||
|
L"\t\t0:\tPersonal Terminal Server\n"
|
||
|
L"\t\t1:\tRemote Administration\n"
|
||
|
L"\t\t2:\tPer Seat\n"
|
||
|
L"\t\t3:\tInternet Connector\n"
|
||
|
L"\t\t4:\tPer Session\n"
|
||
|
,
|
||
|
szName
|
||
|
);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int __cdecl main(int argc, char *argv[])
|
||
|
{
|
||
|
DWORD dwStatus;
|
||
|
DWORD dwNewStatus;
|
||
|
BOOL fSet = FALSE;
|
||
|
BOOL fGet = FALSE;
|
||
|
BOOL fList = FALSE;
|
||
|
BOOL fInfo = FALSE;
|
||
|
ULONG ulMode;
|
||
|
HANDLE hServer = NULL;
|
||
|
BOOL fRet;
|
||
|
ULONG *pulPolicyIds = NULL;
|
||
|
ULONG cPolicies;
|
||
|
ULONG ulInfoStructVersion = LCPOLICYINFOTYPE_CURRENT;
|
||
|
LPLCPOLICYINFO_V1W pPolicyInfo = NULL;
|
||
|
|
||
|
if (argc < 2)
|
||
|
{
|
||
|
Usage(argv[0]);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
if ((argv[1][1] == 's') || (argv[1][1] == 'S'))
|
||
|
{
|
||
|
if (argc < 3)
|
||
|
{
|
||
|
Usage(argv[0]);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
ulMode = atol(argv[2]);
|
||
|
|
||
|
fSet = TRUE;
|
||
|
}
|
||
|
else if ((argv[1][1] == 'i') || (argv[1][1] == 'I'))
|
||
|
{
|
||
|
if (argc < 3)
|
||
|
{
|
||
|
Usage(argv[0]);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
ulMode = atol(argv[2]);
|
||
|
|
||
|
fInfo = TRUE;
|
||
|
}
|
||
|
else if ((argv[1][1] == 'g') || (argv[1][1] == 'G'))
|
||
|
{
|
||
|
fGet = TRUE;
|
||
|
}
|
||
|
else if ((argv[1][1] == 'l') || (argv[1][1] == 'L'))
|
||
|
{
|
||
|
fList = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Usage(argv[0]);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
hServer = ServerLicensingOpen(NULL);
|
||
|
|
||
|
if (NULL == hServer)
|
||
|
{
|
||
|
wprintf(L"Connect to server failed\n");
|
||
|
MyReportError(GetLastError());
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
if (fGet)
|
||
|
{
|
||
|
fRet = ServerLicensingGetPolicy(
|
||
|
hServer,
|
||
|
&ulMode
|
||
|
);
|
||
|
|
||
|
wprintf(L"Get Mode\n");
|
||
|
|
||
|
if (fRet)
|
||
|
{
|
||
|
wprintf(L"Mode: %d\n"
|
||
|
,
|
||
|
ulMode
|
||
|
);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
wprintf(L"Failed\n");
|
||
|
MyReportError(GetLastError());
|
||
|
}
|
||
|
}
|
||
|
else if (fList)
|
||
|
{
|
||
|
fRet = ServerLicensingGetAvailablePolicyIds(
|
||
|
hServer,
|
||
|
&pulPolicyIds,
|
||
|
&cPolicies
|
||
|
);
|
||
|
wprintf(L"List Modes\n");
|
||
|
|
||
|
if (fRet)
|
||
|
{
|
||
|
wprintf(L"Modes: \n");
|
||
|
|
||
|
for (ULONG i = 0; i < cPolicies; i++)
|
||
|
{
|
||
|
wprintf(L"%d "
|
||
|
,
|
||
|
pulPolicyIds[i]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
wprintf(L"\n");
|
||
|
|
||
|
MIDL_user_free(pulPolicyIds);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
wprintf(L"Failed\n");
|
||
|
MyReportError(GetLastError());
|
||
|
}
|
||
|
}
|
||
|
else if (fSet)
|
||
|
{
|
||
|
dwStatus = ServerLicensingSetPolicy(hServer,
|
||
|
ulMode,
|
||
|
&dwNewStatus);
|
||
|
|
||
|
wprintf(L"Set Mode\n"
|
||
|
L"RPC Status: %d\n"
|
||
|
L"New Mode Status: %d\n"
|
||
|
,
|
||
|
dwStatus,
|
||
|
dwNewStatus
|
||
|
);
|
||
|
|
||
|
if (ERROR_SUCCESS != dwStatus)
|
||
|
MyReportError(dwStatus);
|
||
|
else if (ERROR_SUCCESS != dwNewStatus)
|
||
|
MyReportError(dwNewStatus);
|
||
|
|
||
|
}
|
||
|
else if (fInfo)
|
||
|
{
|
||
|
fRet = ServerLicensingGetPolicyInformation(
|
||
|
hServer,
|
||
|
ulMode,
|
||
|
&ulInfoStructVersion,
|
||
|
(LPLCPOLICYINFOGENERIC *) &pPolicyInfo
|
||
|
);
|
||
|
|
||
|
if (fRet)
|
||
|
{
|
||
|
wprintf(L"Get Mode Info\n"
|
||
|
L"Name: %s\n"
|
||
|
L"Description: %s\n"
|
||
|
,
|
||
|
pPolicyInfo->lpPolicyName,
|
||
|
pPolicyInfo->lpPolicyDescription
|
||
|
);
|
||
|
|
||
|
ServerLicensingFreePolicyInformation((LPLCPOLICYINFOGENERIC *)&pPolicyInfo);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
wprintf(L"Failed\n");
|
||
|
MyReportError(GetLastError());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ServerLicensingClose(hServer);
|
||
|
|
||
|
cleanup:
|
||
|
|
||
|
return 0;
|
||
|
}
|