|
|
1.1 ! root 1: /****************************************************************************\ ! 2: * ! 3: * Microsoft Developer Support ! 4: * Copyright (c) 1992, 1993 Microsoft Corporation ! 5: * ! 6: * MODULE: sd_flppy.c ! 7: * ! 8: * There is no way to put a DACL on the floppy drives or on the ! 9: * COM ports with REGEDT32, or using the Control Panel or other ! 10: * part of the user interface. And there is no way to use the ! 11: * Win32 api to put a DACL on the floppy drives or on the COM ! 12: * ports that survives reboots ! 13: * ! 14: * sd_flppy.c, however, does put DACLs on the floppy drives or on ! 15: * the COM ports that survive logoff/logon, that is, these ! 16: * DACLs are on the floppy drives or on the COM ports until the ! 17: * next reboot ! 18: * ! 19: * A version of this sample program can be installed as a ! 20: * service, so that each time the machine boots up the DACLs ! 21: * are automatically re-applied ! 22: * ! 23: * PURPOSE: Show sample code that applies DACLs to floppy drives and COM ! 24: * ports ! 25: * ! 26: * There are possibly as many desired user interfaces to this ! 27: * sort of functionality as there are people thinking about ! 28: * this, so it is not a purpose of this sample (or the Win32 ! 29: * service variation of it) to present an incredibly cool user ! 30: * interface to how the DACLs get applied. A very simplistic ! 31: * approach is taken to the user interface. Anyone who desires ! 32: * that more complicated DACLs are applied, or desires other ! 33: * variations in the user interface hopefully will benefit by ! 34: * being able to use this sample code as a starting point for ! 35: * their DACL-applying app ! 36: * ! 37: * This sample is not a supported utility ! 38: * ! 39: * TO RUN: Type sd_flppy to lock the \\.\A: and \\.\B devices ! 40: * ! 41: * Putting sd_flppy in a Startup group or logon script could work ! 42: * for some people ! 43: * ! 44: \****************************************************************************/ ! 45: ! 46: /****************************************************************************\ ! 47: * INCLUDES, DEFINES ! 48: \****************************************************************************/ ! 49: #define STRICT ! 50: #include <windows.h> ! 51: #include <stdlib.h> ! 52: #include <stdio.h> ! 53: ! 54: #define PERR(api) printf("\n%s: Error %d from %s on line %d", \ ! 55: __FILE__, GetLastError(), api, __LINE__); ! 56: #define PMSG(msg) printf("\n%s line %d: %s", \ ! 57: __FILE__, __LINE__, msg); ! 58: ! 59: /****************************************************************************\ ! 60: * GLOBAL VARIABLES AND TYPEDEFS ! 61: \****************************************************************************/ ! 62: ! 63: ! 64: /****************************************************************************\ ! 65: * FUNCTION PROTOTYPES ! 66: \****************************************************************************/ ! 67: ! 68: BOOL WriteSD_ToA_File(PSECURITY_DESCRIPTOR psdAbsoluteSD, LPTSTR lpszFileName); ! 69: VOID DisplayHelp(VOID); ! 70: ! 71: UINT main(UINT argc, char *argv[]) ! 72: { ! 73: ! 74: #define SZ_SD_BUF 100 ! 75: #define SZ_SID_BUF 75 ! 76: #define SZ_ACL_BUF 150 ! 77: ! 78: UCHAR ucAbsSDBuf [SZ_SD_BUF] = ""; ! 79: UCHAR ucSIDBuf [SZ_SID_BUF] = ""; ! 80: UCHAR ucACLBuf [SZ_ACL_BUF] = ""; ! 81: ! 82: DWORD dwSID = SZ_SID_BUF; ! 83: DWORD dwDACL = SZ_ACL_BUF; ! 84: ! 85: PSECURITY_DESCRIPTOR psdAbsoluteSD = (PSECURITY_DESCRIPTOR)&ucAbsSDBuf; ! 86: PSID psidAdministrators = (PSID)&ucSIDBuf; ! 87: PACL pNewDACL = (PACL)&ucACLBuf; ! 88: ! 89: /**************************************************************************\ ! 90: * ! 91: * Display help if any parameters passed in ! 92: * ! 93: \**************************************************************************/ ! 94: ! 95: if (argc != 1) ! 96: { DisplayHelp(); ! 97: return(1); ! 98: } ! 99: ! 100: /**************************************************************************\ ! 101: * ! 102: * Get SID of local Administrators ! 103: * ! 104: \**************************************************************************/ ! 105: ! 106: { ! 107: #define SZ_DOMAIN_BUF 40 ! 108: #define SZ_PSNU_BUF 8 ! 109: UCHAR ucDomainBuf [SZ_DOMAIN_BUF] = ""; ! 110: UCHAR ucPSNUBuf [SZ_PSNU_BUF] = ""; ! 111: ! 112: DWORD dwDomainName = SZ_DOMAIN_BUF; ! 113: ! 114: LPSTR lpszDomain = (LPSTR)&ucDomainBuf; ! 115: PSID_NAME_USE psnuType = (PSID_NAME_USE)&ucPSNUBuf; ! 116: ! 117: if(!LookupAccountName((LPSTR)NULL, /* local name */ ! 118: "Administrators", ! 119: psidAdministrators, ! 120: &dwSID, ! 121: lpszDomain, ! 122: &dwDomainName, ! 123: psnuType)) ! 124: { PERR("LookupAccountName"); ! 125: return(1); ! 126: } ! 127: ! 128: if (*psnuType != SidTypeAlias) ! 129: { PMSG("LookupAccountName returned the wrong SID type"); ! 130: return(1); ! 131: } ! 132: } ! 133: ! 134: /**************************************************************************\ ! 135: * ! 136: * Initialize new DACL ! 137: * ! 138: \**************************************************************************/ ! 139: ! 140: if (!InitializeAcl(pNewDACL, ! 141: dwDACL, ! 142: ACL_REVISION2)) ! 143: { PERR("InitializeAcl"); ! 144: return(1); ! 145: } ! 146: ! 147: /**************************************************************************\ ! 148: * ! 149: * Allow All access to the floppy for local Administrators only ! 150: * ! 151: \**************************************************************************/ ! 152: ! 153: if (!AddAccessAllowedAce(pNewDACL, ! 154: ACL_REVISION2, ! 155: FILE_ALL_ACCESS, ! 156: psidAdministrators)) ! 157: { PERR("AddAccessAllowedAce"); ! 158: return(1); ! 159: } ! 160: ! 161: /**************************************************************************\ ! 162: * ! 163: * Build SD in absolute format ! 164: * ! 165: \**************************************************************************/ ! 166: ! 167: if (!InitializeSecurityDescriptor(psdAbsoluteSD, ! 168: SECURITY_DESCRIPTOR_REVISION)) ! 169: { PERR("InitializeSecurityDescriptor"); ! 170: return(1); ! 171: } ! 172: ! 173: /**************************************************************************\ ! 174: * ! 175: * Set DACL into SD ! 176: * ! 177: \**************************************************************************/ ! 178: ! 179: if (!SetSecurityDescriptorDacl(psdAbsoluteSD, ! 180: TRUE, // fDaclPresent flag ! 181: pNewDACL, ! 182: FALSE)) // not a default DACL ! 183: { PERR("SetSecurityDescriptorDacl"); ! 184: return(1); ! 185: } ! 186: ! 187: /**************************************************************************\ ! 188: * ! 189: * Check to see that SD is valid before attempting to write it to the file ! 190: * ! 191: \**************************************************************************/ ! 192: ! 193: if (!IsValidSecurityDescriptor(psdAbsoluteSD)) ! 194: { PERR("IsValidSecurityDescriptor"); ! 195: return(1); ! 196: } ! 197: ! 198: /**************************************************************************\ ! 199: * ! 200: * Write SD to file system - first for A: then B: ! 201: * ! 202: \**************************************************************************/ ! 203: ! 204: if (!WriteSD_ToA_File(psdAbsoluteSD,"\\\\.\\A:")) ! 205: { return(1); ! 206: } ! 207: ! 208: if (!WriteSD_ToA_File(psdAbsoluteSD,"\\\\.\\B:")) ! 209: { return(1); ! 210: } ! 211: ! 212: /**************************************************************************\ ! 213: * ! 214: * Works for CDROM drives as well - commented out as this samples is floppy ! 215: * only ! 216: * ! 217: \**************************************************************************/ ! 218: /* ! 219: if (!WriteSD_ToA_File(psdAbsoluteSD,"\\\\.\\E:")) ! 220: { return(1); ! 221: } ! 222: */ ! 223: /**************************************************************************\ ! 224: * ! 225: * Works for COM ports as well - commented out as this samples is floppy only ! 226: * ! 227: \**************************************************************************/ ! 228: /* ! 229: if (!WriteSD_ToA_File(psdAbsoluteSD,"COM1:")) ! 230: { return(1); ! 231: } ! 232: */ ! 233: return(0); ! 234: } ! 235: ! 236: /****************************************************************************\ ! 237: * ! 238: * FUNCTION: WriteSD_ToA_File ! 239: * ! 240: \****************************************************************************/ ! 241: ! 242: BOOL WriteSD_ToA_File(PSECURITY_DESCRIPTOR psdAbsoluteSD, LPTSTR lpszFileName) ! 243: { ! 244: DWORD dwErrorMode; ! 245: BOOL bStatus; ! 246: ! 247: /**************************************************************************\ ! 248: * ! 249: * SetErrorMode so we don't get the error due to no floppy disk in the floppy ! 250: * drive ! 251: * ! 252: \**************************************************************************/ ! 253: ! 254: dwErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); ! 255: ! 256: /**************************************************************************\ ! 257: * ! 258: * Write SD to file system ! 259: * ! 260: \**************************************************************************/ ! 261: ! 262: bStatus = SetFileSecurity(lpszFileName, ! 263: (SECURITY_INFORMATION)(DACL_SECURITY_INFORMATION), ! 264: psdAbsoluteSD); ! 265: ! 266: /**************************************************************************\ ! 267: * ! 268: * SetErrorMode back to its previous value ! 269: * ! 270: \**************************************************************************/ ! 271: ! 272: SetErrorMode(dwErrorMode); ! 273: ! 274: if (!bStatus) ! 275: { if (ERROR_FILE_NOT_FOUND == GetLastError()) ! 276: { printf("\nAttempted to lock %s, but it was not found",lpszFileName); ! 277: } ! 278: else ! 279: { PERR("SetFileSecurity"); ! 280: return(FALSE); ! 281: } ! 282: } ! 283: ! 284: return(TRUE); ! 285: } ! 286: ! 287: /****************************************************************************\ ! 288: * ! 289: * FUNCTION: DisplayHelp ! 290: * ! 291: \****************************************************************************/ ! 292: ! 293: VOID DisplayHelp(VOID) ! 294: { ! 295: printf("\nTo run type SD_FLPPY and no (0) parameters. Syntax:"); ! 296: printf("\n SD_FLPPY"); ! 297: printf("\n "); ! 298: printf("\nExamples:"); ! 299: printf("\n SD_FLPPY"); ! 300: printf("\n Puts a DACL on A: and B: so that local Administrators"); ! 301: printf("\n have all access and no one else has any access."); ! 302: printf("\n Since domain Administrators are by default members of"); ! 303: printf("\n local Administrators, this will in many cases give"); ! 304: printf("\n the desired result, but this utility is only one"); ! 305: printf("\n example of the many possible interfaces that may be"); ! 306: printf("\n desired. Full source to this program is available,"); ! 307: printf("\n so people may write different interfaces."); ! 308: printf("\n This .exe could be run from a logon script, or from"); ! 309: printf("\n the Startup group. An alternative approach is to"); ! 310: printf("\n use the other version of this program. The other"); ! 311: printf("\n version is packaged as a service that applies the"); ! 312: printf("\n DACLs when the machine boots up\n"); ! 313: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.