DCOMPERM.CPP
/*++ 
 
DCOM Permission Configuration Sample 
Copyright (c) 1996, Microsoft Corporation. All rights reserved. 
 
Module Name: 
 
    dcomperm.cpp 
 
Abstract: 
 
    Main module for DCOM Permission Configuration Sample 
 
Author: 
 
    Michael Nelson 
 
Environment: 
 
    Windows NT 
 
--*/ 
 
#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <tchar.h> 
#include "ntsecapi.h" 
#include "dcomperm.h" 
 
void 
ShowUsage ( 
    LPTSTR ErrorString 
    ) 
{ 
    _tprintf (TEXT("%s\n"), ErrorString); 
    _tprintf (TEXT("Syntax: dcomperm <option> [...]\n\n")); 
 
    _tprintf (TEXT("Options:\n")); 
 
    _tprintf (TEXT("   -da <\"set\" or \"remove\"> <Principal Name> [\"permit\" or \"deny\"]\n")); 
    _tprintf (TEXT("   -da list\n")); 
    _tprintf (TEXT("       Modify or list the default access permission list\n\n")); 
 
    _tprintf (TEXT("   -dl <\"set\" or \"remove\"> <Principal Name> [\"permit\" or \"deny\"]\n")); 
    _tprintf (TEXT("   -dl list\n")); 
    _tprintf (TEXT("       Modify or list the default launch permission list\n\n")); 
 
    _tprintf (TEXT("   -aa <AppID> <\"set\" or \"remove\"> <Principal Name> [\"permit\" or \"deny\"]\n")); 
    _tprintf (TEXT("   -aa <AppID> default\n")); 
    _tprintf (TEXT("   -aa <AppID> list\n")); 
    _tprintf (TEXT("       Modify or list the access permission list for a specific AppID\n\n")); 
 
    _tprintf (TEXT("   -al <AppID> <\"set\" or \"remove\"> <Principal Name> [\"permit\" or \"deny\"]\n")); 
    _tprintf (TEXT("   -al <AppID> default\n")); 
    _tprintf (TEXT("   -al <AppID> list\n")); 
    _tprintf (TEXT("       Modify or list the launch permission list for a specific AppID\n\n")); 
 
    _tprintf (TEXT("Press any key to continue. . .")); 
    _getch(); 
    _tprintf (TEXT("\r                               \r")); 
 
    _tprintf (TEXT("   -runas <AppID> <Principal Name> <Password>\n")); 
    _tprintf (TEXT("   -runas <AppID> \"Interactive User\"\n")); 
    _tprintf (TEXT("       Set the RunAs information for a specific AppID\n\n")); 
 
    _tprintf (TEXT("Examples:\n")); 
    _tprintf (TEXT("   dcomperm -da set redmond\\t-miken permit\n")); 
    _tprintf (TEXT("   dcomperm -dl set redmond\\jdoe deny\n")); 
    _tprintf (TEXT("   dcomperm -aa {12345678-1234-1234-1234-00aa00bbf7c7} list\n")); 
    _tprintf (TEXT("   dcomperm -al {12345678-1234-1234-1234-00aa00bbf7c7} remove redmond\\t-miken\n")); 
    _tprintf (TEXT("   dcomperm -runas {12345678-1234-1234-1234-00aa00bbf7c7} redmond\\jdoe password\n")); 
 
    exit (0); 
} 
 
void 
Error ( 
    LPTSTR ErrorMessage, 
    DWORD ErrorCode 
    ) 
{ 
    TCHAR messageBuffer [255]; 
 
    _tprintf (TEXT("%s\n%s"), ErrorMessage, SystemMessage (messageBuffer, ErrorCode)); 
    exit (0); 
} 
 
void 
HandleDAOption ( 
    int argc, 
    TCHAR **argv 
    ) 
{ 
    DWORD returnValue; 
 
    if (argc < 3) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (_tcscmp (_tcsupr (argv [2]), TEXT("LIST")) == 0) 
    { 
        _tprintf (TEXT("Default access permission list:\n\n")); 
        ListDefaultAccessACL(); 
        return; 
    } 
 
    if (argc < 4) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (_tcscmp (_tcsupr (argv [2]), TEXT("SET")) == 0) 
    { 
        if (argc < 5) 
            ShowUsage (TEXT("Invalid number of arguments.")); 
 
        if (_tcscmp (_tcsupr (argv [4]), TEXT("PERMIT")) == 0) 
            returnValue = ChangeDefaultAccessACL (argv [3], TRUE, TRUE); else 
 
        if (_tcscmp (_tcsupr (argv [4]), TEXT("DENY")) == 0) 
            returnValue = ChangeDefaultAccessACL (argv [3], TRUE, FALSE); else 
        { 
            ShowUsage (TEXT("You can only set a user's permissions to \"permit\" or \"deny\".\n\n")); 
        } 
 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot add user to default access ACL."), returnValue); 
    } else 
    if (_tcscmp (_tcsupr (argv [2]), TEXT("REMOVE")) == 0) 
    { 
        returnValue = ChangeDefaultAccessACL (argv[3], FALSE, FALSE); 
 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot remove user from default access ACL."), returnValue); 
    } else 
        ShowUsage (TEXT("You can only \"set\" or \"remove\" a user.")); 
} 
 
void 
HandleDLOption ( 
    int argc, 
    TCHAR **argv 
    ) 
{ 
    DWORD returnValue; 
 
    if (argc < 3) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (_tcscmp (_tcsupr (argv [2]), TEXT("LIST")) == 0) 
    { 
        _tprintf (TEXT("Default launch permission list:\n\n")); 
        ListDefaultLaunchACL(); 
        return; 
    } 
 
    if (argc < 4) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (_tcscmp (_tcsupr (argv [2]), TEXT("SET")) == 0) 
    { 
        if (argc < 5) 
            ShowUsage (TEXT("Invalid number of arguments.")); 
 
        if (_tcscmp (_tcsupr (argv [4]), TEXT("PERMIT")) == 0) 
            returnValue = ChangeDefaultLaunchACL (argv [3], TRUE, TRUE); else 
 
        if (_tcscmp (_tcsupr (argv [4]), TEXT("DENY")) == 0) 
            returnValue = ChangeDefaultLaunchACL (argv [3], TRUE, FALSE); else 
        { 
            ShowUsage (TEXT("You can only set a user's permissions to \"permit\" or \"deny\".\n\n")); 
        } 
 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot add user to default launch ACL."), returnValue); 
    } else 
    if (_tcscmp (_tcsupr (argv [3]), TEXT("REMOVE")) == 0) 
    { 
        returnValue = ChangeDefaultLaunchACL (argv[3], FALSE, FALSE); 
 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot remove user from default launch ACL."), returnValue); 
    } else 
        ShowUsage (TEXT("You can only \"set\" or \"remove\" a user.")); 
} 
 
void 
HandleAAOption ( 
    int argc, 
    TCHAR **argv 
    ) 
{ 
    DWORD returnValue; 
    HKEY  registryKey; 
    TCHAR appid [256]; 
    TCHAR keyName [256]; 
 
    if (argc < 4) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (_tcscmp (_tcsupr (argv[3]), TEXT("LIST")) == 0) 
    { 
        if (argc < 4) 
            ShowUsage (TEXT("Invalid number of arguments.")); 
 
        _tprintf (TEXT("Access permission list for AppID %s:\n\n"), argv[2]); 
        ListAppIDAccessACL (argv[2]); 
        return; 
    } 
 
    if (_tcscmp (_tcsupr (argv[3]), TEXT("DEFAULT")) == 0) 
    { 
        if (argv [2][0] == '{') 
            wsprintf (appid, TEXT("%s"), argv [2]); else 
            wsprintf (appid, TEXT("{%s}"), argv [2]); 
 
        wsprintf (keyName, TEXT("APPID\\%s"), appid); 
 
        returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, ®istryKey); 
        if (returnValue != ERROR_SUCCESS && returnValue != ERROR_FILE_NOT_FOUND) 
            Error (TEXT("ERROR: Cannot open AppID registry key."), returnValue); 
 
        returnValue = RegDeleteValue (registryKey, TEXT("AccessPermission")); 
        if (returnValue != ERROR_SUCCESS && returnValue != ERROR_FILE_NOT_FOUND) 
            Error (TEXT("ERROR: Cannot delete AccessPermission value."), returnValue); 
 
        RegCloseKey (registryKey); 
        return; 
    } 
 
    if (argc < 5) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (_tcscmp (_tcsupr (argv [3]), TEXT("SET")) == 0) 
    { 
        if (argc < 6) 
            ShowUsage (TEXT("Invalid number of arguments.")); 
 
        if (_tcscmp (_tcsupr (argv [5]), TEXT("PERMIT")) == 0) 
            returnValue = ChangeAppIDAccessACL (argv[2], argv [4], TRUE, TRUE); else 
 
        if (_tcscmp (_tcsupr (argv [5]), TEXT("DENY")) == 0) 
            returnValue = ChangeAppIDAccessACL (argv[2], argv [4], TRUE, FALSE); else 
        { 
            ShowUsage (TEXT("You can only set a user's permissions to \"permit\" or \"deny\".\n\n")); 
        } 
 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot add user to application access ACL."), returnValue); 
    } else 
    if (_tcscmp (_tcsupr (argv [3]), TEXT("REMOVE")) == 0) 
    { 
        returnValue = ChangeAppIDAccessACL (argv[2], argv[4], FALSE, FALSE); 
 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot remove user from application access ACL."), returnValue); 
    } else 
        ShowUsage (TEXT("You can only \"set\" or \"remove\" a user.")); 
} 
 
void 
HandleALOption ( 
    int argc, 
    TCHAR **argv 
    ) 
{ 
    DWORD returnValue; 
    HKEY  registryKey; 
    TCHAR appid [256]; 
    TCHAR keyName [256]; 
 
    if (argc < 4) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (_tcscmp (_tcsupr (argv[3]), TEXT("LIST")) == 0) 
    { 
        if (argc < 4) 
            ShowUsage (TEXT("Invalid number of arguments.\n")); 
 
        _tprintf (TEXT("Launch permission list for AppID %s:\n\n"), argv[2]); 
        ListAppIDLaunchACL (argv[2]); 
        return; 
    } 
 
    if (_tcscmp (_tcsupr (argv[3]), TEXT("DEFAULT")) == 0) 
    { 
        if (argv [2][0] == '{') 
            wsprintf (appid, TEXT("%s"), argv [2]); else 
            wsprintf (appid, TEXT("{%s}"), argv [2]); 
 
        wsprintf (keyName, TEXT("APPID\\%s"), appid); 
 
        returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, ®istryKey); 
        if (returnValue != ERROR_SUCCESS && returnValue != ERROR_FILE_NOT_FOUND) 
            Error (TEXT("ERROR: Cannot open AppID registry key."), returnValue); 
 
        returnValue = RegDeleteValue (registryKey, TEXT("LaunchPermission")); 
        if (returnValue != ERROR_SUCCESS && returnValue != ERROR_FILE_NOT_FOUND) 
            Error (TEXT("ERROR: Cannot delete LaunchPermission value."), returnValue); 
 
        RegCloseKey (registryKey); 
        return; 
    } 
 
    if (argc < 5) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (_tcscmp (_tcsupr (argv [3]), TEXT("SET")) == 0) 
    { 
        if (argc < 6) 
            ShowUsage (TEXT("Invalid number of arguments.")); 
 
        if (_tcscmp (_tcsupr (argv [5]), TEXT("PERMIT")) == 0) 
            returnValue = ChangeAppIDLaunchACL (argv[2], argv [4], TRUE, TRUE); else 
 
        if (_tcscmp (_tcsupr (argv [5]), TEXT("DENY")) == 0) 
            returnValue = ChangeAppIDLaunchACL (argv[2], argv [4], TRUE, FALSE); else 
        { 
            ShowUsage (TEXT("You can only set a user's permissions to \"permit\" or \"deny\".\n\n")); 
        } 
 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot add user to application launch ACL."), returnValue); 
    } else 
    if (_tcscmp (_tcsupr (argv [3]), TEXT("REMOVE")) == 0) 
    { 
        returnValue = ChangeAppIDLaunchACL (argv[2], argv[4], FALSE, FALSE); 
 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot remove user from application launch ACL."), returnValue); 
    } else 
        ShowUsage (TEXT("You can only \"set\" or \"remove\" a user.")); 
} 
 
void 
HandleRunAsOption ( 
    int argc, 
    TCHAR **argv 
    ) 
{ 
    DWORD returnValue; 
    HKEY  registryKey; 
    TCHAR appid [256]; 
    TCHAR keyName [256]; 
 
    if (argc < 4) 
        ShowUsage (TEXT("Invalid number of arguments.")); 
 
    if (argv [2][0] == '{') 
        wsprintf (appid, TEXT("%s"), argv [2]); else 
        wsprintf (appid, TEXT("{%s}"), argv [2]); 
 
    wsprintf (keyName, TEXT("APPID\\%s"), appid); 
 
    returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, ®istryKey); 
    if (returnValue != ERROR_SUCCESS) 
        Error (TEXT("ERROR: Cannot open AppID registry key."), returnValue); 
 
    returnValue = RegSetValueEx (registryKey, TEXT("RunAs"), 0, REG_SZ, (LPBYTE) argv [3], _tcslen (argv[3]) * sizeof (TCHAR)); 
    if (returnValue != ERROR_SUCCESS) 
        Error (TEXT("ERROR: Cannot set RunAs registry value."), returnValue); 
 
    RegCloseKey (registryKey); 
 
    if (_tcscmp (_tcsupr (argv[3]), TEXT("INTERACTIVE USER")) != 0) 
    { 
        if (argc < 5) 
            ShowUsage (TEXT("Invalid number of arguments.")); 
 
        returnValue = SetRunAsPassword (argv[2], argv[3], argv[4]); 
        if (returnValue != ERROR_SUCCESS) 
            Error (TEXT("ERROR: Cannot set RunAs password."), returnValue); 
    } 
} 
 
extern "C" void 
_tmain ( 
    int argc, 
    TCHAR **argv 
    ) 
{ 
    if (argc < 2) 
        ShowUsage (TEXT("No option specified.")); 
 
    if (_tcscmp (_tcsupr (argv [1]), TEXT("-DA")) == 0) 
        HandleDAOption (argc, argv); else 
 
    if (_tcscmp (_tcsupr (argv [1]), TEXT("-DL")) == 0) 
        HandleDLOption (argc, argv); else 
 
    if (_tcscmp (_tcsupr (argv [1]), TEXT("-AA")) == 0) 
        HandleAAOption (argc, argv); else 
 
    if (_tcscmp (_tcsupr (argv [1]), TEXT("-AL")) == 0) 
        HandleALOption (argc, argv); else 
 
    if (_tcscmp (_tcsupr (argv [1]), TEXT("-RUNAS")) == 0) 
        HandleRunAsOption (argc, argv); else 
 
    ShowUsage (TEXT("Invalid option specified.")); 
}