The following line causes a memory leak:
"foreach (SearchResult sr in s.FindAll())"
The reason for this can be found here:
http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx
Ultimately, any time you use a SearchResultCollection object (such as when you call DirectorySearcher.FindAll), you must dispose the SearchResultCollection object yourself. A fix would be to put the s.FindAll() result into a variable managed by a USING block.