Error im getting:
An unhandled exception of type 'System.StackOverflowException' occurred in System.Management.dll
My callstack:
[Managed to Native Transition]
System.Management.dll!System.Management.ManagementScope.InitializeGuts(object o) + 0x1a3 bytes
System.Management.dll!System.Management.ManagementScope.Initialize() + 0xa3 bytes
System.Management.dll!System.Management.ManagementScope.Connect() + 0x5 bytes
Computer_Managerment.exe!Computer_Managerment.WMI.ComputerInformation.ComputerInformation(string ComputerName = "pc357", string UserName = "", string Password = "") Line 228 + 0xd bytes C#
Computer_Managerment.exe!Computer_Managerment.ScanAllComputers.Workerthread() Line 95 + 0x1e bytes C#
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x66 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes
Code where i get the stackoverflow:
try
{
gManager = new ManagementScope(ConnectStr, oConn); //\\\\" +
gManager.Connect(); // This is where the crash happens
}
catch (UnauthorizedAccessException)
{
// Code removed
}
The code basicly works in this fastion
1) I have a list of all the computers in AD ( Over 1k )
2) I have 10 threads spinning a while loop getting a compuer out of the Que List.
3) When they have a computer name they make a instance of the ComputerInformation class that does the gManager.Connect(); that again crashes.
Its my understanding that this crash/stackoverflow is happening inside native code, but i assume im doing something wrong. If any more code is required il happely post it.
Pr request more code: This is the code that the workers live in ( Normaly around 10 workers )
internal struct stWorkList
{
public Queue<string> Work;
public List<ComputerInformation> CompInfo;
public int FailedComputers;
public int FailedPingCheck;
public int SuccessComputers;
public int TotalComputers;
public int FailedAuth;
public int FailedToContactWMIServer;
}
stWorkList gWorkList;
void Workerthread()
{
Monitor.Enter(gUserName);
Monitor.Enter(gPassword);
string UserName = gUserName;
string Password = gPassword;
Monitor.Exit(gPassword);
Monitor.Exit(gUserName);
while (true)
{
Monitor.Enter(gWorkList.Work);
if (gWorkList.Work.Count == 0)
{
Monitor.Exit(gWorkList.Work);
break;
}
string ComputerName = gWorkList.Work.Dequeue();
Monitor.Exit(gWorkList.Work);
if (ComputerName == null)
continue;
ComputerInformation iCI = new ComputerInformation(ComputerName, UserName, Password);
Monitor.Enter(gWorkList.CompInfo);
gWorkList.CompInfo.Add(iCI);
switch (iCI.Status)
{
case eComputerCheckStatus.Connected:
gWorkList.SuccessComputers++;
break;
case eComputerCheckStatus.FailedPingTest:
gWorkList.FailedPingCheck++;
gWorkList.FailedComputers++;
break;
case eComputerCheckStatus.UnauthorizedAccessException:
gWorkList.FailedComputers++;
gWorkList.FailedAuth++;
break;
case eComputerCheckStatus.FailedToContactWMIService:
gWorkList.FailedToContactWMIServer++;
gWorkList.FailedComputers++;
break;
case eComputerCheckStatus.UnkownFailed:
gWorkList.FailedComputers++;
break;
}
Monitor.Exit(gWorkList.CompInfo);
iCI.Dispose();
}
}
Constructor in the ComputerInformation class
public ComputerInformation(string ComputerName, string UserName, string Password)
{
gComputerName = ComputerName;
gHardDriveList = new List<stHarddiskInfo>();
gProccessInfo = new List<stProccessInfo>();
gCPUInfo = new List<stCPUInformation>();
gOSInfo = new stOSInfo();
gMemoryInfo = new List<stMemoryInfo>();
gPreformanceMemory = new stPreformanceMemory();
gProccessOverView = new stProccessOverview();
gMonitorInfo = new List<stMonitorInfo>();
gNetworkInfo = new List<stNetworkInfo>();
netMon = new Ping();
PingResponse response = netMon.PingHost(ComputerName, 1);
if (response == null || response.PacketsReceived == 0)
{
gStatus = eComputerCheckStatus.FailedPingTest;
gHasError = true;
return;
}
gComputerIP = response.ServerEndPoint.Address.ToString();
ConnectionOptions oConn = new ConnectionOptions();
oConn.Timeout = new TimeSpan(0, 0, 10);
if (!string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(UserName))
{
oConn.Username = UserName;
oConn.Password = Password;
}
string ConnectStr = "\\\\" + ComputerName + "\\root\\cimv2";
try
{
gManager = new ManagementScope(ConnectStr, oConn); //\\\\" +
gManager.Connect(); // this is where it crashes
}
catch (UnauthorizedAccessException)
{
gStatus = eComputerCheckStatus.UnauthorizedAccessException;
gHasError = true;
return;
}
catch (Exception Ex)
{
if (Ex.Message.Contains("The RPC server is unavailable"))
{
gStatus = eComputerCheckStatus.FailedToContactWMIService;
}
else
gStatus = eComputerCheckStatus.UnkownFailed;
gHasError = true;
return;
}
gStatus = eComputerCheckStatus.Connected;
try
{
GetRunningProccessInfo();
GetCPUInformation();
GetHardDriveInfo();
GetOSInfo();
GetMemoryInfo();
GetMonitorInfo();
GetComputerSystem();
}
catch
{
gStatus = eComputerCheckStatus.UnkownFailed;
gHasError = true;
}
}