windows-nt/Source/XPSP1/NT/admin/extens/acldiag/acldiag.cpp
2020-09-26 16:20:57 +08:00

202 lines
6.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1999.
//
// File: ACLDiag.cpp
//
// Contents: Defines the entry point for the console application.
//
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "adutils.h"
#include "SecDesc.h"
#include "schema.h"
#include "ChkDeleg.h"
#include "EffRight.h"
CACLDiagComModule _Module;
// Function prototypes
void DisplayHelp ();
// Command-line options string constants
const wstring strSchemaFlag = L"/schema";
const wstring strCheckDelegationFlag = L"/chkdeleg";
const wstring strGetEffectiveFlag = L"/geteffective:";
const wstring strFixDelegationFlag = L"/fixdeleg";
const wstring strTabDelimitedOutputFlag = L"/tdo";
const wstring strLogFlag = L"/log:";
const wstring strHelpFlag = L"/?";
const wstring strSkipDescriptionFlag = L"/skip";
int _cdecl main(int argc, char* argv[])
{
UNREFERENCED_PARAMETER (argv);
// If no arguments provided, display the help
if ( 1 == argc )
{
DisplayHelp ();
return 0;
}
#if DBG
CheckDebugOutputLevel ();
#endif
LPCWSTR * lpServiceArgVectors = 0; // Array of pointers to string
int cArgs = 0; // Count of arguments
size_t lenFlag = strGetEffectiveFlag.length ();
lpServiceArgVectors = (LPCWSTR *)CommandLineToArgvW(GetCommandLineW(), OUT &cArgs);
if (lpServiceArgVectors == NULL)
return NULL;
for (int nToken = 1; nToken < cArgs; nToken++)
{
ASSERT(lpServiceArgVectors[nToken] != NULL);
if ( !lpServiceArgVectors[nToken] )
break;
wstring strToken = lpServiceArgVectors[nToken]; // Copy the string
switch (nToken)
{
case 0: // appName: skip
continue;
case 1: // object name or a help flag
if ( !_wcsnicmp (strHelpFlag.c_str (), strToken.c_str (),
strToken.length ()) )
{
DisplayHelp ();
return 0;
}
else
_Module.SetObjectDN (strToken);
break;
default:
{
size_t lenToken = strToken.length ();
if ( !_wcsnicmp (strSchemaFlag.c_str (), strToken.c_str (),
lenToken))
{
_Module.SetDoSchema ();
}
else if ( !_wcsnicmp (strCheckDelegationFlag.c_str (),
strToken.c_str (), lenToken) )
{
_Module.SetCheckDelegation ();
}
else if ( !_wcsnicmp (strGetEffectiveFlag.c_str (),
strToken.c_str (), lenFlag) )
{
wstring strUserGroup = strToken.substr(lenFlag,
lenToken);
_Module.SetDoGetEffective (strUserGroup);
}
else if ( !_wcsnicmp (strFixDelegationFlag.c_str (),
strToken.c_str (), lenToken) )
{
_Module.SetFixDelegation ();
}
else if ( !_wcsnicmp (strTabDelimitedOutputFlag.c_str (),
strToken.c_str (), lenToken) )
{
_Module.SetTabDelimitedOutput ();
}
else if ( !_wcsnicmp (strLogFlag.c_str (), strToken.c_str (),
lenFlag) )
{
wstring strPath = strToken.substr(lenFlag, lenToken);
_Module.SetDoLog (strPath);
}
else if ( !_wcsnicmp (strSkipDescriptionFlag.c_str (),
strToken.c_str (), lenToken) )
{
_Module.SetSkipDescription ();;
}
else if ( !_wcsnicmp (strHelpFlag.c_str (), strToken.c_str (),
lenToken) )
{
DisplayHelp ();
return 0;
}
else
{
wstring str;
FormatMessage (str, IDS_INVALID_OPTION, strToken.c_str ());
MyWprintf (str.c_str ());
DisplayHelp ();
return 0;
}
}
break;
}
}
LocalFree (lpServiceArgVectors);
HRESULT hr = CoInitialize(NULL);
if ( SUCCEEDED (hr) )
{
hr = _Module.Init ();
if ( SUCCEEDED (hr) )
{
hr = DoSecurityDescription ();
if ( SUCCEEDED (hr) && _Module.DoSchema () )
hr = DoSchemaDiagnosis ();
if ( SUCCEEDED (hr) && _Module.CheckDelegation () )
hr = CheckDelegation ();
if ( SUCCEEDED (hr) && _Module.DoGetEffective () )
hr = EffectiveRightsDiagnosis ();
}
else
DisplayHelp ();
}
else
{
_TRACE (0, L"CoInitialize Failed with %x\n",hr);
return 0;
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////
//
// Method: DisplayHelp
//
// Print the purpose of the tool and each of the command-line options.
//
///////////////////////////////////////////////////////////////////////////////
void DisplayHelp ()
{
CWString str;
int helpIDs[] = {IDS_HELP_MAIN,
IDS_HELP_SCHEMA,
IDS_HELP_CHKDELEG,
IDS_HELP_GETEFFECTIVE,
IDS_HELP_CDO,
// IDS_HELP_LOG,
IDS_HELP_SKIP_DESCRIPTION,
0};
for (int nIndex = 0; helpIDs[nIndex]; nIndex++)
{
str.LoadFromResource (helpIDs[nIndex]);
MyWprintf (str.c_str ());
}
}