|
Hmmm.....Option 1 is not really feesable because of cost. Options 2 and 3 would be a big pain although they are doable.
I think there has to be a way to do what I am trying to accompish biw the Interop. I'm able to get and set properties by using type.InvokeMember() and I can even get an event object by using type.GetEvent(), I just need that last little bit to bind it to my event handlers.
Thank you,
Eric Ritzie
|
|
|
|
|
I am at a lost. I have verified what I am doing against the documentation on microsofts website:
http://msdn.microsoft.com/en-us/library/aa392154(VS.85).aspx[^] and I just can't figure out why it would give me this error.
My Connection object is not shown as it is global within the class I have it in. I am connect to this machine that is not on the domain and get installed applications, all services, and computer information. The problem is it keeps throwing a "Invalid Method Parameter(s)" error.
In case your wondering.. I ran a foreach look on the inParams.Properties and verified that all the method parameters existed in the inParams (which it does).
Any help would be great!
public string Join(string dns, string domain, string username, string password)
{
try
{
ManagementScope scope = new ManagementScope(@"\\" + dns + @"\root\CIMV2", conn);
ManagementPath path = new ManagementPath("Win32_ComputerSystem");
ManagementClass mgmtClass = new ManagementClass(scope, path, null);
ManagementBaseObject inParams = mgmtClass.GetMethodParameters("JoinDomainOrWorkgroup");
inParams["Name"] = domain;
inParams["UserName"] = username;
inParams["Password"] = password;
inParams["AccountOU"] = null;
inParams["FJoinOptions"] = (UInt32)1;
ManagementBaseObject outParams = mgmtClass.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
string status = ReturnedValue.JoinDomainOrWorkgroup(Convert.ToInt32(outParams["ReturnValue"]));
return status;
}
catch (Exception ex)
{
EventLog.WriteEntry("ADEM Application", ex.Message, EventLogEntryType.Error);
return ex.Message;
}
}
|
|
|
|
|
Hi Jacob,
I'm not familiar with the specifics of your query, however I strongly advice everyone to always look at Exception.ToString() as it often contains much more than a Message and a TraceBack; there may be additional information, and one or more inner exceptions.
|
|
|
|
|
Good idea.. but I didn't really find anything worth while that I can see. I even set break points and can't seem to find out why it is doing this.. WMI is a pain sometimes
System.Management.ManagementException: Invalid method Parameter(s)
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.ManagementObject.InvokeMethod(String methodName, ManagementBaseObject inParameters, InvokeMethodOptions options)
at WMI.WMI_Commands.Join(String dns, String domain, String username, String password) in C:\Users\jdixon\Documents\Visual Studio 2008\Projects\DLL\WMI\frmWMI.cs:line 92
|
|
|
|
|
As you have posted that link, I presume you are using PInvoke of JoinDomainOrWorkgroup
I saw that it expects to pass 5 parameters (According to MSDN) and you are using only one
|
|
|
|
|
I am passing 4 parameters:
inParams["Name"] = domain;
inParams["UserName"] = username;
inParams["Password"] = password;
inParams["AccountOU"] = null;
inParams["FJoinOptions"] = (UInt32)1;
I am actually specifying 5 but the AccountOU one is optional. This is using WMI
|
|
|
|
|
Your Code:
ManagementBaseObject outParams = mgmtClass.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
string status = ReturnedValue.JoinDomainOrWorkgroup(Convert.ToInt32(outParams["ReturnValue"]));
At witch line it does fail?
Also how do you use define how do you use that delegate?
|
|
|
|
|
Fails:
ManagementBaseObject outParams = mgmtClass.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
|
|
|
|
|
try
{
ManagementObject classInstance =
new ManagementObject("root\\CIMV2",
"Win32_ComputerSystem.Name='BSAKSIDA-PC'",
null);
ManagementBaseObject inParams =
classInstance.GetMethodParameters("JoinDomainOrWorkgroup");
inParams["AccountOU"] = " OU=testOU, DC=domain, DC=Domain, DC=com";
inParams["Name"] = "WORKGROUP";
inParams["Password"] = null;
inParams["Username"] = "everyone";
ManagementBaseObject outParams =
classInstance.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
Console.WriteLine("Out parameters:");
Console.WriteLine("ReturnValue: " + outParams["ReturnValue"]);
}
catch(ManagementException err)
{
MessageBox.Show("An error occurred while trying to execute the WMI method: " + err.Message);
}
I Used this example to get it working on mine side. I do not know how to do it in your case, because i only have Workgroup not domain
WMI Code Creator[^]
I Used that tool (Can run C# code as script) to create that WMI call. I do not know why it fail, bat play with that tool.
Tip: Look at »Execute a Method«, under menu select apropriate target. Method [in] Parameters are buggy, so write manualy inside generated code on left. You can directly execute the code without Visual Studio
|
|
|
|
|
I am using the WMI Code Creator also.
I modified what you supplied a little and still have no luck.
try
{
ManagementObject classInstance = new ManagementObject("\\WIN-HSPKIXZR3HK\\root\\CIMV2", "Win32_ComputerSystem", null);
ManagementBaseObject inParams = classInstance.GetMethodParameters("JoinDomainOrWorkgroup");
inParams["AccountOU"] = " OU=Computers, DC=adem, DC=arkansas, DC=gov";
inParams["Name"] = "WORKGROUP";
inParams["Password"] = null;
inParams["Username"] = "everyone";
ManagementBaseObject outParams = classInstance.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
Console.WriteLine(outParams["ReturnValue"]);
}
catch (ManagementException err)
{
Console.WriteLine(err.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
ERROR:
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.4927
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
System.ArgumentOutOfRangeException: Specified argument was out of the range of v
alid values.
Parameter name: path
at System.Management.ManagementObject.ManagementObjectCTOR(ManagementScope sc
ope, ManagementPath path, ObjectGetOptions options)
at System.Management.ManagementObject..ctor(String scopeString, String pathSt
ring, ObjectGetOptions options)
at WMISample.CallWMIMethod.Main()
C:\Windows\Microsoft.NET\Framework\v2.0.50727>
I also tried this way which is more like what you supplied:
try
{
ManagementObject classInstance = new ManagementObject("\\root\\CIMV2", "Win32_ComputerSystem.Name='WIN-HSPKIXZR3HK'", null);
ManagementBaseObject inParams = classInstance.GetMethodParameters("JoinDomainOrWorkgroup");
inParams["AccountOU"] = " OU=Computers, DC=adem, DC=arkansas, DC=gov";
inParams["Name"] = "WORKGROUP";
inParams["Password"] = null;
inParams["Username"] = "everyone";
ManagementBaseObject outParams = classInstance.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
Console.WriteLine(outParams["ReturnValue"]);
}
catch (ManagementException err)
{
Console.WriteLine(err.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
With ERROR:
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.4927
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
System.Management.ManagementException: Not found
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStat
us errorCode)
at System.Management.ManagementObject.Initialize(Boolean getObject)
at System.Management.ManagementBaseObject.get_wbemObject()
at System.Management.ManagementObject.get_ClassPath()
at System.Management.ManagementObject.GetMethodParameters(String methodName,
ManagementBaseObject& inParameters, IWbemClassObjectFreeThreaded& inParametersCl
ass, IWbemClassObjectFreeThreaded& outParametersClass)
at System.Management.ManagementObject.GetMethodParameters(String methodName)
at WMISample.CallWMIMethod.Main()
C:\Windows\Microsoft.NET\Framework\v2.0.50727>
|
|
|
|
|
I Have tried both example. I do not know why it fails, but the second fails because WIN-HSPKIXZR3HK is incorectly. The example I provided connects to LocalHost (Same Computer). It is very hard to help if you want to connect to Domain, because I can not test it. (Probably i wolould Need dedicated machine with Windows 2003 server or 2008 server). Have you tried to put IP for destenation computer?
|
|
|
|
|
I understand. I think it is something wrong with the code provided by microsoft. I have googled this with no luck of anyone doing it with a remote computer. Technically it should work. Using code like I have provided, I am able to install software, uninstall software, get list of services, get list of disk drives with amount of space, free space, etc... and even model and vendor information about the computer.
The fact that the error it gives me is "Invalid Method Parameters" tells me that the code on MSDN is fishy. It doesn't say it can't work for a remote computer...
I don't know..
Let me ask you this, do you know if there is any way to accomplish this with PInvoke? I know there is this: http://www.pinvoke.net/default.aspx/netapi32/NetJoinDomain.html[^] but that seems only able to join the local computer to the domain. Not a remote computer
|
|
|
|
|
You know I think I can make NetJoinDomain work. I can write a console application that takes the arguments as the information used to join the local computer... but what I can do is copy the console application to the computer, execute that console application from a remote computer using Win32_Process and then reboot it if it was successful
|
|
|
|
|
That could be done. I suggest to try to go to Microsoft forums for more info about this problem.
|
|
|
|
|
I have posted.. just FYI I have even tried the Reboot under Win32_OperatingSystem. It gives me a "Invalid Method Parameters" as well.. funny thing is this doesn't take any parameters! Lokos like part of WMI is crap
|
|
|
|
|
For myself I do not use WMI. My programming is Hobby. Please let me know if you will get positive answer.
One way to solve it is to create specific process (Possibly Service) and it acs as server, where it is capable to execute your commands or even scripts
|
|
|
|
|
Hi
Please somebody help me.
I need a connectionstring for c#windows application that connect to my database(my database near exe files in bin)without attach my database in microsoft sql 2005.
|
|
|
|
|
An SQL Server database must be attached to an SQL Server in order to access it.
There are databases don't rely on a server, you could try one of those, but I don't recommend it.
Why don't you want to attach it? You could attach it only for the duration of your application.
|
|
|
|
|
Why would you need to do that?
50-50-90 rule: Anytime I have a 50-50 chance of getting something right, there's a 90% probability I'll get it wrong...!!
|
|
|
|
|
There's two items: your database, and a database-server. You can only manipulate databases that are (temporarily) attached. You can talk to a database-file after you informed the server where the file is located. Try something like this;
Server=.\SQLExpress;
AttachDbFilename=|DataDirectory|\myDatabase.mdf;
Database=DatabaseAlias;
Trusted_Connection=Yes;
The "AttachDbFilename" makes sure that you can access the database-file without having to "attach" it.
Good luck
I are Troll
|
|
|
|
|
If you don't want to rely on a DB server, you can us a smaler DBMS like SQLite
I use that from time to time with minor apps.
|
|
|
|
|
private void pbTextEdit_Click(object sender, EventArgs e)
{
Header header = new Header();
header.Show();
}
private void pbTextEdit_MouseHover(object sender, EventArgs e)
{
pbTextEdit.Image = Image.FromFile("C:/data/edit_color.gif");
}
I'f im hovering it it ain't changing the image?
What i wanna do is:
Only when I'm moving with my mouse over the picturebox that it is changing from picture then. And when I leave it it is going back to the normal one in the properties.
Dennis
|
|
|
|
|
The "hover" event will be fired continuously while your mouse is over the control. Try the OnMouseEnter[^] event to set the picture, and the OnMouseLeave[^] event to reset the original picture, that should do the trick
I are Troll
|
|
|
|
|
You should use "\" not "/" to write file location
use:
private void pbTextEdit_MouseHover(object sender, EventArgs e)
{
pbTextEdit.Image = Image.FromFile(@"C:\data\edit_color.gif"); // not ("C:/data/edit_color.gif");
}
to reveres the effect use the MouseLeave event:
private void pbTextEdit_MouseLeave(object sender, EventArgs e)
{
pbTextEdit.Image = Image.FromFile("Your privious image here....");
}
hope this helps
|
|
|
|
|
Hi
I want to markup one of the rows of mydatagridview for example i paint one of the rows.
what should i do?
|
|
|
|