1 /* $Id: ShellCommandDACL.cpp,v 1.1 2000/10/04 21:04:30 ea Exp $
3 * regexpl - Console Registry Explorer
5 * Copyright (c) 1999-2000 Nedko Arnaoudov <nedkohome@atia.com>
11 // ShellCommandDACL.cpp: implementation of the CShellCommandDACL class.
13 //////////////////////////////////////////////////////////////////////
16 #include "ShellCommandDACL.h"
17 #include "RegistryExplorer.h"
18 #include "SecurityDescriptor.h"
20 #define DACL_CMD _T("DACL")
21 #define DACL_CMD_LENGTH COMMAND_LENGTH(DACL_CMD)
22 #define DACL_CMD_SHORT_DESC DACL_CMD _T(" command is used to view")/*"/edit"*/_T(" key's DACL.\n")
24 //////////////////////////////////////////////////////////////////////
25 // Construction/Destruction
26 //////////////////////////////////////////////////////////////////////
28 CShellCommandDACL::CShellCommandDACL(CRegistryTree
& rTree
):m_rTree(rTree
)
33 CShellCommandDACL::~CShellCommandDACL()
38 BOOL
CShellCommandDACL::Match(const TCHAR
*pchCommand
)
40 if (_tcsicmp(pchCommand
,DACL_CMD
) == 0)
42 if (_tcsnicmp(pchCommand
,DACL_CMD
_T(".."),DACL_CMD_LENGTH
+2*sizeof(TCHAR
)) == 0)
44 if (_tcsnicmp(pchCommand
,DACL_CMD
_T("/") ,DACL_CMD_LENGTH
+1*sizeof(TCHAR
)) == 0)
46 if (_tcsnicmp(pchCommand
,DACL_CMD
_T("\\"),DACL_CMD_LENGTH
+1*sizeof(TCHAR
)) == 0)
51 int CShellCommandDACL::Execute(CConsole
&rConsole
, CArgumentParser
& rArguments
)
53 rArguments
.ResetArgumentIteration();
55 const TCHAR
*pchKey
= NULL
;
57 BOOL blnBadParameter
= FALSE
;
59 const TCHAR
*pchParameter
;
60 const TCHAR
*pchCommandItself
= rArguments
.GetNextArgument();
63 if ((_tcsnicmp(pchCommandItself
,DACL_CMD
_T(".."),DACL_CMD_LENGTH
+2*sizeof(TCHAR
)) == 0)||
64 (_tcsnicmp(pchCommandItself
,DACL_CMD
_T("\\"),DACL_CMD_LENGTH
+1*sizeof(TCHAR
)) == 0))
66 pchKey
= pchCommandItself
+ DACL_CMD_LENGTH
;
68 else if (_tcsnicmp(pchCommandItself
,DACL_CMD
_T("/"),DACL_CMD_LENGTH
+1*sizeof(TCHAR
)) == 0)
70 pchParameter
= pchCommandItself
+ DACL_CMD_LENGTH
;
71 goto CheckDACLArgument
;
74 while((pchParameter
= rArguments
.GetNextArgument()) != NULL
)
77 blnBadParameter
= FALSE
;
78 if ((_tcsicmp(pchParameter
,_T("/?")) == 0)
79 ||(_tcsicmp(pchParameter
,_T("-?")) == 0))
82 blnDo
= pchKey
!= NULL
;
86 pchKey
= pchParameter
;
91 blnBadParameter
= TRUE
;
95 rConsole
.Write(_T("Bad parameter: "));
96 rConsole
.Write(pchParameter
);
97 rConsole
.Write(_T("\n"));
101 CRegistryTree
*pTree
= NULL
;
102 CRegistryKey
*pKey
= NULL
;
105 pTree
= new CRegistryTree(m_rTree
);
106 if ((_tcscmp(pTree
->GetCurrentPath(),m_rTree
.GetCurrentPath()) != 0)||(!pTree
->ChangeCurrentKey(pchKey
)))
108 rConsole
.Write(_T("Cannot open key "));
109 rConsole
.Write(pchKey
);
110 rConsole
.Write(_T("\n"));
116 pKey
= pTree
->GetCurrentKey();
121 pKey
= m_rTree
.GetCurrentKey();
126 rConsole
.Write(GetHelpString());
129 if (blnDo
&&blnHelp
) rConsole
.Write(_T("\n"));
135 rConsole
.Write(DACL_CMD COMMAND_NA_ON_ROOT
);
139 DWORD dwSecurityDescriptorLength
;
140 rConsole
.Write(_T("Key : "));
141 rConsole
.Write(_T("\\"));
142 rConsole
.Write(pTree
?pTree
->GetCurrentPath():m_rTree
.GetCurrentPath());
143 rConsole
.Write(_T("\n"));
144 PSECURITY_DESCRIPTOR pSecurityDescriptor
= NULL
;
145 TCHAR
*pchName
= NULL
, *pchDomainName
= NULL
;
148 dwError
= pKey
->GetSecurityDescriptorLength(&dwSecurityDescriptorLength
);
149 if (dwError
!= ERROR_SUCCESS
) throw dwError
;
151 pSecurityDescriptor
= (PSECURITY_DESCRIPTOR
) new unsigned char [dwSecurityDescriptorLength
];
152 DWORD dwSecurityDescriptorLength1
= dwSecurityDescriptorLength
;
153 dwError
= pKey
->GetSecurityDescriptor((SECURITY_INFORMATION
)DACL_SECURITY_INFORMATION
,pSecurityDescriptor
,&dwSecurityDescriptorLength1
);
154 if (dwError
!= ERROR_SUCCESS
) throw dwError
;
155 CSecurityDescriptor sd
;
156 sd
.AssociateDescriptor(pSecurityDescriptor
);
158 sd
.BeginDACLInteration();
159 ASSERT(sd
.DescriptorContainsDACL());
160 if (sd
.HasNULLDACL())
162 rConsole
.Write(_T("Key has not DACL.\n(This allows all access)\n"));
166 if (!sd
.HasValidDACL())
168 rConsole
.Write(_T("Invalid DACL.\n"));
172 DWORD nACECount
= sd
.GetDACLEntriesCount();
173 rConsole
.Write(_T("DACL has "));
175 rConsole
.Write(_itot(nACECount
,Buffer
,10));
176 rConsole
.Write(_T(" ACEs.\n"));
179 rConsole
.Write(_T("(This denies all access)\n"));
183 for (DWORD i
= 0 ; i
< nACECount
; i
++)
185 rConsole
.Write(_T("\n"));
186 rConsole
.Write(_T("\tACE Index: "));
187 rConsole
.Write(_itot(i
,Buffer
,10));
188 rConsole
.Write(_T("\n"));
189 rConsole
.Write(_T("\tACE Type: "));
190 switch (sd
.GetDACLEntry(i
))
192 case CSecurityDescriptor::AccessAlowed
:
193 rConsole
.Write(_T("Access-allowed\n"));
195 case CSecurityDescriptor::AccessDenied
:
196 rConsole
.Write(_T("Access-denied\n"));
199 rConsole
.Write(_T("Unknown.\nCannot continue dumping of the ACE list.\n"));
202 PSID pSID
= sd
.GetCurrentACE_SID();
203 if ((pSID
== NULL
)||(!IsValidSid(pSID
)))
205 rConsole
.Write(_T("\tInvalid SID.\n"));
209 DWORD dwSIDStringSize
= 0;
210 BOOL blnRet
= GetTextualSid(pSID
,NULL
,&dwSIDStringSize
);
212 ASSERT(GetLastError() == ERROR_INSUFFICIENT_BUFFER
);
213 TCHAR
*pchSID
= new TCHAR
[dwSIDStringSize
];
214 if(!GetTextualSid(pSID
,pchSID
,&dwSIDStringSize
))
216 dwError
= GetLastError();
217 ASSERT(dwError
!= ERROR_INSUFFICIENT_BUFFER
);
218 rConsole
.Write(_T("Error "));
220 rConsole
.Write(_itot(dwError
,Buffer
,10));
221 rConsole
.Write(_T("\nGetting string representation of SID\n"));
225 rConsole
.Write(_T("\tSID: "));
226 rConsole
.Write(pchSID
);
227 rConsole
.Write(_T("\n"));
230 DWORD dwNameBufferLength
, dwDomainNameBufferLength
;
231 dwNameBufferLength
= 1024;
232 dwDomainNameBufferLength
= 1024;
233 pchName
= new TCHAR
[dwNameBufferLength
];
234 pchDomainName
= new TCHAR
[dwDomainNameBufferLength
];
235 DWORD dwNameLength
= dwNameBufferLength
, dwDomainNameLength
= dwDomainNameBufferLength
;
237 if (!LookupAccountSid(NULL
,pSID
,pchName
,&dwNameLength
,pchDomainName
,&dwDomainNameLength
,&Use
))
239 rConsole
.Write(_T("Error "));
241 rConsole
.Write(_itot(GetLastError(),Buffer
,10));
242 rConsole
.Write(_T("\n"));
246 rConsole
.Write(_T("\tTrustee Domain: "));
247 rConsole
.Write(pchDomainName
);
248 rConsole
.Write(_T("\n"));
249 rConsole
.Write(_T("\tTrustee Name: "));
250 rConsole
.Write(pchName
);
251 rConsole
.Write(_T("\n\tSID type: "));
252 rConsole
.Write(GetSidTypeName(Use
));
253 rConsole
.Write(_T("\n"));
257 delete [] pchDomainName
;
258 pchDomainName
= NULL
;
261 sd
.GetCurrentACE_AccessMask(dwAccessMask
);
262 wsprintf(Buffer
,_T("\tAccess Mask: 0x%08lX\n"),dwAccessMask
);
263 rConsole
.Write(Buffer
);
264 if (dwAccessMask
& GENERIC_READ
)
266 rConsole
.Write(_T("\t\tGENERIC_READ\n"));
268 if (dwAccessMask
& GENERIC_WRITE
)
270 rConsole
.Write(_T("\t\tGENERIC_WRITE\n"));
272 if (dwAccessMask
& GENERIC_EXECUTE
)
274 rConsole
.Write(_T("\t\tGENERIC_EXECUTE\n"));
276 if (dwAccessMask
& GENERIC_ALL
)
278 rConsole
.Write(_T("\t\tGENERIC_ALL\n"));
280 if (dwAccessMask
& SYNCHRONIZE
)
282 rConsole
.Write(_T("\t\tSYNCHRONIZE\n"));
284 if (dwAccessMask
& WRITE_OWNER
)
286 rConsole
.Write(_T("\t\tWRITE_OWNER\n"));
288 if (dwAccessMask
& WRITE_DAC
)
290 rConsole
.Write(_T("\t\tWRITE_DAC\n"));
292 if (dwAccessMask
& READ_CONTROL
)
294 rConsole
.Write(_T("\t\tREAD_CONTROL\n"));
296 if (dwAccessMask
& DELETE
)
298 rConsole
.Write(_T("\t\tDELETE\n"));
300 if (dwAccessMask
& KEY_CREATE_LINK
)
302 rConsole
.Write(_T("\t\tKEY_CREATE_LINK\n"));
304 if (dwAccessMask
& KEY_NOTIFY
)
306 rConsole
.Write(_T("\t\tKEY_NOTIFY\n"));
308 if (dwAccessMask
& KEY_ENUMERATE_SUB_KEYS
)
310 rConsole
.Write(_T("\t\tKEY_ENUMERATE_SUB_KEYS\n"));
312 if (dwAccessMask
& KEY_CREATE_SUB_KEY
)
314 rConsole
.Write(_T("\t\tKEY_CREATE_SUB_KEY\n"));
316 if (dwAccessMask
& KEY_SET_VALUE
)
318 rConsole
.Write(_T("\t\tKEY_SET_VALUE\n"));
320 if (dwAccessMask
& KEY_QUERY_VALUE
)
322 rConsole
.Write(_T("\t\tKEY_QUERY_VALUE\n"));
325 } // else (nACECount == 0)
326 } // else (!sd.HasValidDACL())
327 } // else (sd.HasNULLDACL())
329 delete [] pSecurityDescriptor
;
331 catch (DWORD dwError
)
333 rConsole
.Write(_T("Error "));
335 rConsole
.Write(_itot(dwError
,Buffer
,10));
336 rConsole
.Write(_T("\n"));
337 if (pchName
) delete [] pchName
;
338 if (pchDomainName
) delete [] pchDomainName
;
339 if (pSecurityDescriptor
) delete [] pSecurityDescriptor
;
341 } // else (pKey == NULL)
350 const TCHAR
* CShellCommandDACL::GetHelpString()
352 return DACL_CMD_SHORT_DESC
353 _T("Syntax: ") DACL_CMD
_T(" [<KEY>] [/?]\n\n")
354 _T(" <KEY> - Optional relative path of desired key.\n")
355 _T(" /? - This help.\n\n")
356 _T("Without parameters, command displays DACL of current key.\n");
359 const TCHAR
* CShellCommandDACL::GetHelpShortDescriptionString()
361 return DACL_CMD_SHORT_DESC
;