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 bytesSystem.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;
}
}
good point to start, is to check if this code is throwing exception.
Update
You doesnt have Monitor.Enter/Exit block on iCI initialization (and where existing problem exception).
to check if this is the problem you can make simple log.
if my suggestion is right, you will receive in log, something like this:
“connect to computer1”
“connect to computer2”
and immidiately exception.