@@ -36,6 +36,9 @@ namespace PingCastle.Healthcheck
36
36
{
37
37
public class HealthcheckAnalyzer : IPingCastleAnalyzer < HealthcheckData >
38
38
{
39
+ private const string LatinUpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
40
+ private const string LatinLowerCase = "abcdefghijklmnopqrstuvwxyz" ;
41
+
39
42
public static bool SkipNullSession { get ; set ; }
40
43
HealthcheckData healthcheckData ;
41
44
@@ -2004,7 +2007,7 @@ void ThreadGPOAnalysis(ADWebService adws, string directoryFullName, GPO GPO, ADD
2004
2007
path = directoryFullName + @"\Machine\Preferences\Registry\Registry.xml" ;
2005
2008
if ( adws . FileConnection . FileExists ( path ) )
2006
2009
{
2007
- ExtractGPOSettingsFromRegistryXml ( path , GPO ) ;
2010
+ ExtractNetSessionHardeningFromRegistryXml ( path , GPO ) ;
2008
2011
}
2009
2012
2010
2013
}
@@ -2072,36 +2075,50 @@ private void ExtractLoginPassword(IADConnection adws, string path, GPO GPO, stri
2072
2075
}
2073
2076
}
2074
2077
2075
- private void ExtractGPOSettingsFromRegistryXml ( string path , GPO GPO )
2076
- {
2077
- XmlDocument doc = new XmlDocument ( ) ;
2078
+ private void ExtractNetSessionHardeningFromRegistryXml ( string path , GPO gpo ) {
2079
+ const string valueName = "SrvsvcSessionInfo" ;
2080
+ const string valuePath = @"SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity" ;
2081
+
2082
+ var xPath = string . Format ( "//Registry/Properties[translate(@name, \" {0}\" , \" {1}\" )=\" {2}\" ][translate(@key, \" {0}\" , \" {1}\" )=\" {3}\" ]" ,
2083
+ LatinUpperCase ,
2084
+ LatinLowerCase ,
2085
+ valueName . ToLowerInvariant ( ) ,
2086
+ valuePath . ToLowerInvariant ( ) ) ;
2087
+
2088
+ var doc = new XmlDocument ( ) ;
2078
2089
doc . Load ( path ) ;
2079
- XmlNodeList nodeList = doc . SelectNodes ( @"//Registry/Properties[@name=""SrvsvcSessionInfo""][@key=""SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity""]" ) ;
2080
- if ( nodeList . Count > 0 )
2090
+
2091
+ var nodeList = doc . SelectNodes ( xPath ) ;
2092
+ if ( nodeList . Count == 0 ) {
2093
+ return ;
2094
+ }
2095
+
2096
+ GPPSecurityPolicy secPol = null ;
2097
+ foreach ( var policy in healthcheckData . GPOLsaPolicy )
2081
2098
{
2082
- GPPSecurityPolicy SecurityPolicy = null ;
2083
- foreach ( GPPSecurityPolicy policy in healthcheckData . GPOLsaPolicy )
2099
+ if ( policy . GPOId == gpo . InternalName )
2084
2100
{
2085
- if ( policy . GPOId == GPO . InternalName )
2086
- {
2087
- SecurityPolicy = policy ;
2088
- break ;
2089
- }
2101
+ secPol = policy ;
2102
+ break ;
2090
2103
}
2091
- if ( SecurityPolicy == null )
2092
- {
2093
- SecurityPolicy = new GPPSecurityPolicy ( ) ;
2094
- SecurityPolicy . GPOName = GPO . DisplayName ;
2095
- SecurityPolicy . GPOId = GPO . InternalName ;
2104
+ }
2096
2105
2097
- lock ( healthcheckData . GPOLsaPolicy )
2098
- {
2099
- healthcheckData . GPOLsaPolicy . Add ( SecurityPolicy ) ;
2100
- }
2101
- SecurityPolicy . Properties = new List < GPPSecurityPolicyProperty > ( ) ;
2106
+ if ( secPol == null )
2107
+ {
2108
+ secPol = new GPPSecurityPolicy {
2109
+ GPOName = gpo . DisplayName ,
2110
+ GPOId = gpo . InternalName
2111
+ } ;
2112
+
2113
+ lock ( healthcheckData . GPOLsaPolicy )
2114
+ {
2115
+ healthcheckData . GPOLsaPolicy . Add ( secPol ) ;
2102
2116
}
2103
- SecurityPolicy . Properties . Add ( new GPPSecurityPolicyProperty ( "SrvsvcSessionInfo" , 1 ) ) ;
2117
+
2118
+ secPol . Properties = new List < GPPSecurityPolicyProperty > ( ) ;
2104
2119
}
2120
+
2121
+ secPol . Properties . Add ( new GPPSecurityPolicyProperty ( valueName , 1 ) ) ;
2105
2122
}
2106
2123
2107
2124
private void ExtractRegistryPolInfo ( IADConnection adws , ADDomainInfo domainInfo , string directoryFullName , GPO GPO )
0 commit comments