Trouble getting file owner on large amount of files
Hi All,
First, let me start by saying that I do not know c++ very well :-)
What we are trying to do is simply get the owner of all files that reside on
a file server.
There currently are about 850,000 files.
The code we are using is posted below.
The problem we are having is that when the FindFiles routine is run, the
kernel memory usage on the server increases by about 70 MB,
then when we get the owner of the files that were placed in the vector by
the scan, kernel memory usage exceeds 150MB and kills the network connection
on the server.
Now I know that DumpSec can do this without taking out our server, so what
are we doing wrong????
Any help at all is appreciated!!!
Here is the code:
// FindFiles.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
#include <iostream>
#include <string>
#include <winbase.h>
#include <aclapi.h>
#include <winerror.h>
#include <stdlib.h>
#include <vector>
#define UNAMEMAXSIZE 256
using namespace std;
//this call uses up about 70 MB of kernel mem on server
void FindFiles(string szDirectory);
long GetFileOwner(char *pcFilePath, char szReturnOwner[1000], int &iSize);
vector<string> strVecFileNames; //vector of file names
int main(int argc, char* argv[])
{
char chOwner[1000];
int iSize;
string stri = "Z:";
FindFiles(stri);
//this eventually kills the network connection on the server and the share
is no longer available!!!
for(int i=0; i<strVecFileNames.size(); i++){
GetFileOwner((char*)strVecFileNames[i].c_str(), chOwner, iSize);
cout << chOwner << " " << strVecFileNames[i] << endl;
}
return 0;
}
//======================================================================
// FindFiles
//======================================================================
void FindFiles(string szDirectory)
{
WIN32_FIND_DATA FindData;
// if there is something worth looking at...
HANDLE hFind = FindFirstFile((szDirectory + "\\*.*").c_str(), &FindData);
if (hFind != INVALID_HANDLE_VALUE) {
// go through all the results...
do {
strlwr(FindData.cFileName);
string szFileName(FindData.cFileName);
string szSuffix =
szFileName.substr(szFileName.find_last_of(".")+1);
// we looking at a directory?? then call this function *again* to
look in it
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (szFileName != "." && szFileName != "..") {
FindFiles(szDirectory + "\\" + szFileName);
strVecFileNames.push_back(szDirectory + "\\" +
szFileName);
}
}
else
{
strVecFileNames.push_back(szDirectory + "\\" +
szFileName);
cout << szDirectory + "\\" + szFileName << endl;
}
}
while (FindNextFile(hFind, &FindData));
FindClose(hFind);
}
}
//==================================================================================
// GetFileOwner
// Gets the owner of a file
//==================================================================================
long GetFileOwner(char *pcFilePath, char szReturnOwner[1000], int &iSize)
{
try
{
//LPSTR file_name = new char[1000];
PSID psid;
PSECURITY_DESCRIPTOR ppSecurityDescriptor;
DWORD cbName=UNAMEMAXSIZE;
//char Name[UNAMEMAXSIZE];
char ReferencedDomainName[256];
DWORD cbReferencedDomainName = 256;
SID_NAME_USE peUse;
int Result;
ppSecurityDescriptor = NULL;
psid = NULL;
//strcpy(file_name,pcFilePath);
Result =
GetNamedSecurityInfo(pcFilePath,
SE_FILE_OBJECT,
OWNER_SECURITY_INFORMATION,
&psid,
NULL, // sidGroup is not needed
NULL, // dACL is not needed
NULL, // sACL is not needed
&ppSecurityDescriptor);
if( Result )
return -100;
Result =
LookupAccountSid(NULL,
psid,
szReturnOwner,
&cbName ,
ReferencedDomainName,
&cbReferencedDomainName,
&peUse);
if( !Result )
return -200;
LocalFree( ppSecurityDescriptor ); // we dont need it and I do not know if
I could pass NULL
if( !Result )
return -200;
Result = 0;
return 0;
}
catch(...)
{
return -300;
}
}
--
Thanks for any help!
Dan Artuso