1 /* $Id: ShellCommandOwner.cpp,v 1.1 2000/10/04 21:04:31 ea Exp $
3 * regexpl - Console Registry Explorer
5 * Copyright (c) 1999-2000 Nedko Arnaoudov <nedkohome@atia.com>
11 // ShellCommandOwner.cpp: implementation of the CShellCommandOwner class.
13 //////////////////////////////////////////////////////////////////////
16 #include "ShellCommandOwner.h"
17 #include "RegistryExplorer.h"
18 #include "SecurityDescriptor.h"
20 #define OWNER_CMD _T("OWNER")
21 #define OWNER_CMD_LENGTH COMMAND_LENGTH(OWNER_CMD)
22 #define OWNER_CMD_SHORT_DESC OWNER_CMD _T(" command is used to view")/*"/change"*/_T(" key's owner.\n")
24 //////////////////////////////////////////////////////////////////////
25 // Construction/Destruction
26 //////////////////////////////////////////////////////////////////////
28 CShellCommandOwner::CShellCommandOwner(CRegistryTree
& rTree
):m_rTree(rTree
)
32 CShellCommandOwner::~CShellCommandOwner()
36 BOOL
CShellCommandOwner::Match(const TCHAR
*pchCommand
)
38 if (_tcsicmp(pchCommand
,OWNER_CMD
) == 0)
40 if (_tcsnicmp(pchCommand
,OWNER_CMD
_T(".."),OWNER_CMD_LENGTH
+2*sizeof(TCHAR
)) == 0)
42 if (_tcsnicmp(pchCommand
,OWNER_CMD
_T("/") ,OWNER_CMD_LENGTH
+1*sizeof(TCHAR
)) == 0)
44 if (_tcsnicmp(pchCommand
,OWNER_CMD
_T("\\"),OWNER_CMD_LENGTH
+1*sizeof(TCHAR
)) == 0)
49 int CShellCommandOwner::Execute(CConsole
&rConsole
, CArgumentParser
& rArguments
)
51 const TCHAR
*pchKey
= NULL
;
53 BOOL blnBadParameter
= FALSE
;
55 const TCHAR
*pchParameter
;
58 rArguments
.ResetArgumentIteration();
59 const TCHAR
*pchCommandItself
= rArguments
.GetNextArgument();
61 if ((_tcsnicmp(pchCommandItself
,OWNER_CMD
_T(".."),OWNER_CMD_LENGTH
+2*sizeof(TCHAR
)) == 0)||
62 (_tcsnicmp(pchCommandItself
,OWNER_CMD
_T("\\"),OWNER_CMD_LENGTH
+1*sizeof(TCHAR
)) == 0))
64 pchKey
= pchCommandItself
+ OWNER_CMD_LENGTH
;
66 else if (_tcsnicmp(pchCommandItself
,OWNER_CMD
_T("/"),OWNER_CMD_LENGTH
+1*sizeof(TCHAR
)) == 0)
68 pchParameter
= pchCommandItself
+ OWNER_CMD_LENGTH
;
69 goto CheckOwnerArgument
;
72 while((pchParameter
= rArguments
.GetNextArgument()) != NULL
)
75 blnBadParameter
= FALSE
;
76 if ((_tcsicmp(pchParameter
,_T("/?")) == 0)
77 ||(_tcsicmp(pchParameter
,_T("-?")) == 0))
80 blnDo
= pchKey
!= NULL
;
84 pchKey
= pchParameter
;
89 blnBadParameter
= TRUE
;
93 rConsole
.Write(_T("Bad parameter: "));
94 rConsole
.Write(pchParameter
);
95 rConsole
.Write(_T("\n"));
99 CRegistryTree
*pTree
= NULL
;
100 CRegistryKey
*pKey
= NULL
;
104 pTree
= new CRegistryTree(m_rTree
);
105 if ((_tcscmp(pTree
->GetCurrentPath(),m_rTree
.GetCurrentPath()) != 0)||(!pTree
->ChangeCurrentKey(pchKey
)))
107 rConsole
.Write(_T("Cannot open key "));
108 rConsole
.Write(pchKey
);
109 rConsole
.Write(_T("\n"));
115 pKey
= pTree
->GetCurrentKey();
120 pKey
= m_rTree
.GetCurrentKey();
125 rConsole
.Write(GetHelpString());
128 if (blnDo
&&blnHelp
) rConsole
.Write(_T("\n"));
134 rConsole
.Write(OWNER_CMD COMMAND_NA_ON_ROOT
);
138 PSECURITY_DESCRIPTOR pSecurityDescriptor
= NULL
;
139 TCHAR
*pchName
= NULL
, *pchDomainName
= NULL
;
142 DWORD dwSecurityDescriptorLength
;
143 rConsole
.Write(_T("Key : "));
144 rConsole
.Write(_T("\\"));
145 rConsole
.Write(pTree
?pTree
->GetCurrentPath():m_rTree
.GetCurrentPath());
146 rConsole
.Write(_T("\n"));
147 dwError
= pKey
->GetSecurityDescriptorLength(&dwSecurityDescriptorLength
);
148 if (dwError
!= ERROR_SUCCESS
) throw dwError
;
150 pSecurityDescriptor
= (PSECURITY_DESCRIPTOR
) new unsigned char [dwSecurityDescriptorLength
];
151 DWORD dwSecurityDescriptorLength1
= dwSecurityDescriptorLength
;
152 dwError
= pKey
->GetSecurityDescriptor((SECURITY_INFORMATION
)OWNER_SECURITY_INFORMATION
,pSecurityDescriptor
,&dwSecurityDescriptorLength1
);
153 if (dwError
!= ERROR_SUCCESS
) throw dwError
;
155 BOOL blnOwnerDefaulted
;
156 if (!GetSecurityDescriptorOwner(pSecurityDescriptor
,&psidOwner
,&blnOwnerDefaulted
))
157 throw GetLastError();
158 if (psidOwner
== NULL
)
160 rConsole
.Write(_T("Key has no owner."));
164 if (!IsValidSid(psidOwner
))
166 rConsole
.Write(_T("Key has invalid owner SID."));
170 rConsole
.Write(_T("Key Owner: \n"));
171 DWORD dwSIDStringSize
= 0;
172 BOOL blnRet
= GetTextualSid(psidOwner
,NULL
,&dwSIDStringSize
);
174 ASSERT(GetLastError() == ERROR_INSUFFICIENT_BUFFER
);
175 TCHAR
*pchSID
= new TCHAR
[dwSIDStringSize
];
176 if(!GetTextualSid(psidOwner
,pchSID
,&dwSIDStringSize
))
178 dwError
= GetLastError();
179 ASSERT(dwError
!= ERROR_INSUFFICIENT_BUFFER
);
180 rConsole
.Write(_T("Error "));
182 rConsole
.Write(_itot(dwError
,Buffer
,10));
183 rConsole
.Write(_T("\nGetting string representation of SID\n"));
187 rConsole
.Write(_T("\tSID: "));
188 rConsole
.Write(pchSID
);
189 rConsole
.Write(_T("\n"));
192 DWORD dwNameBufferLength
, dwDomainNameBufferLength
;
193 dwNameBufferLength
= 1024;
194 dwDomainNameBufferLength
= 1024;
195 pchName
= new TCHAR
[dwNameBufferLength
];
196 pchDomainName
= new TCHAR
[dwDomainNameBufferLength
];
197 DWORD dwNameLength
= dwNameBufferLength
, dwDomainNameLength
= dwDomainNameBufferLength
;
199 if (!LookupAccountSid(NULL
,psidOwner
,pchName
,&dwNameLength
,pchDomainName
,&dwDomainNameLength
,&Use
))
200 throw GetLastError();
203 rConsole
.Write(_T("\tOwner Domain: "));
204 rConsole
.Write(pchDomainName
);
205 rConsole
.Write(_T("\n"));
206 rConsole
.Write(_T("\tOwner Name: "));
207 rConsole
.Write(pchName
);
208 rConsole
.Write(_T("\n\tSID type: "));
209 rConsole
.Write(GetSidTypeName(Use
));
210 rConsole
.Write(_T("\n"));
211 rConsole
.Write(_T("\tOwner defaulted: "));
212 rConsole
.Write(blnOwnerDefaulted
?_T("Yes"):_T("No"));
213 rConsole
.Write(_T("\n"));
217 delete [] pchDomainName
;
218 pchDomainName
= NULL
;
222 delete [] pSecurityDescriptor
;
224 catch (DWORD dwError
)
226 rConsole
.Write(_T("Error "));
228 rConsole
.Write(_itot(dwError
,Buffer
,10));
229 rConsole
.Write(_T("\n"));
230 if (pchName
) delete [] pchName
;
231 if (pchDomainName
) delete [] pchDomainName
;
232 if (pSecurityDescriptor
) delete [] pSecurityDescriptor
;
234 } // else (pKey == NULL)
243 const TCHAR
* CShellCommandOwner::GetHelpString()
245 return OWNER_CMD_SHORT_DESC
246 _T("Syntax: ") OWNER_CMD
_T(" [<KEY>] [/?]\n\n")
247 _T(" <KEY> - Optional relative path of desired key.\n")
248 _T(" /? - This help.\n\n")
249 _T("Without parameters, command displays information about owner of current key.\n");
252 const TCHAR
* CShellCommandOwner::GetHelpShortDescriptionString()
254 return OWNER_CMD_SHORT_DESC
;