Creating a shared folder programmatically c# - c#

I am trying to create the shared folder in computer management shares with the following code
ManagementClass managementClass = new ManagementClass("Win32_Share");
ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
ManagementBaseObject outParams;
inParams["Description"] = Description;
inParams["Name"] = ShareName;
inParams["Path"] = FolderPath;
inParams["Type"] = 0x0; // Disk Drive
outParams = managementClass.InvokeMethod("Create", inParams, null);
var res = (uint)(outParams.Properties["ReturnValue"].Value);
res always returns 2.
Can anyone be of help in this regard?
What does it 2 mean and what are all the other output parameters?

Based on Create method of Win32_Share documentation , possible return values are :
Success (0)
Access denied (2)
Unknown failure (8)
Invalid name (9)
Invalid level (10)
Invalid parameter (21)
Duplicate share (22)
Redirected path (23)
Unknown device or directory (24)
Net name not found (25)
Other (26–4294967295)

Related

Create VM with WMI in c#

I am trying to create a VM in Hyper-V with WMI.
ManagementClass virtualSystemManagementService =
new ManagementClass(#"root\virtualization\v2:Msvm_VirtualSystemManagementService");
ManagementBaseObject inParams =
virtualSystemManagementService
.GetMethodParameters("DefineSystem");
// Add the input parameters.
ManagementClass virtualSystemSettingData =
new ManagementClass(#"root\virtualization\v2:Msvm_VirtualSystemSettingData")
{
["ElementName"] = "Test"
};
inParams["SystemSettings"] =
virtualSystemSettingData.GetText(TextFormat.CimDtd20);
// Execute the method and obtain the return values.
ManagementBaseObject outParams =
virtualSystemManagementService
.InvokeMethod("DefineSystem", inParams, null);
The call to InvokeMethod throws an System.Management.MangementException - "Invalid method Parameter(s).
I am basing this code on https://blogs.msdn.microsoft.com/virtual_pc_guy/2013/06/20/creating-a-virtual-machine-with-wmi-v2/
I do realize that this is really easy with powershell, but I am trying to understand how the WMI side of things works.
Basic workflow For Virtual Machine Creation using WMI with C#:
You missed creating an instance of VirtualSystemSettingData and getting an instance of VirtualSystemManagment Service.
The exception System.Management.MangementException - "Invalid method Parameter(s) is thrown when you call invoke method on a class not an object!
Create VirtualSystemSettingData class
Add Properties
Create new VirtualSystemSettingData instance
Convert to text
Pass to params
Create VirtualSystemManagementService class
Get existing VirtualSystemManagementService instance
Invoke Method
Example:
ManagementClass virtualSystemManagementServiceClass =
new ManagementClass(#"root\virtualization\v2:Msvm_VirtualSystemManagementService");
ManagementBaseObject inParams =
virtualSystemManagementServiceClass
.GetMethodParameters("DefineSystem");
// Add the input parameters.
ManagementClass virtualSystemSettingDataClass =
new ManagementClass(#"root\virtualization\v2:Msvm_VirtualSystemSettingData")
{
["ElementName"] = "Test"
};
// Create Instance of VirtualSystemSettingData
ManagementObject virtualSystemSettingData = virtualSystemSettingDataClass.CreateInstance();
inParams["SystemSettings"] =
virtualSystemSettingData.GetText(TextFormat.CimDtd20);
// Get Instance of VirtualSystemManagmentService
ManagementObject virtualSystemManagementService = null;
foreach (ManagementObject instance in virtualSystemManagementServiceClass.GetInstances())
{
virtualSystemManagementService = instance;
break;
}
// Execute the method and obtain the return values.
ManagementBaseObject outParams = virtualSystemManagementService.InvokeMethod("DefineSystem", inParams, null);
You need to create an instance of msvm_VirtualSystemSettingData.
ManagementObject newInstance = new ManagementClass(scope, new ManagementPath("Msvm_VirtualSystemSettingData"), null).CreateInstance();
newInstance["ElementName"] = vmName;
inParameters["SystemSettings"] = newInstance.GetText(TextFormat.CimDtd20);

Sharing Folder API

I have C# WinForm application that needs to set sharing permission to some folder, and specify what users have access read/write/delete.
I was wondering if there is any api or way to call something similar to when you right click on folder select Properties/Sharing/Advanced Sharing and window opens.
If you know of anyway calling this window from c# I would appreciate if you share your knowledge.
I want to call this window.
You can do it through Win32 API:
private static void QshareFolder(string FolderPath, string ShareName, string Description)
{
try
{
// Create a ManagementClass object
ManagementClass managementClass = new ManagementClass("Win32_Share");
// Create ManagementBaseObjects for in and out parameters
ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
ManagementBaseObject outParams;
// Set the input parameters
inParams["Description"] = Description;
inParams["Name"] = ShareName;
inParams["Path"] = FolderPath;
inParams["Type"] = 0x0; // Disk Drive
// Invoke the method on the ManagementClass object
outParams = managementClass.InvokeMethod("Create", inParams, null);
if ((uint)(outParams.Properties["ReturnValue"].Value) != 0)
{
throw new Exception("Unable to share directory.");
}
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message, "error!");
}
}
Usage:
QshareFolder("c:\TestShare", "Test Share", "This is a Test Share");
Source: http://www.codeproject.com/Articles/18624/How-to-Share-Windows-Folders-Using-C
There is no any standart API for this task.
Try this project to implement what you need How to Share Windows Folders Using C# (and here there is another example https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/de213b61-dc7e-4f33-acdb-893aa96837fa/c-set-directory-sharing-permission-full-control-for-everyone-programmatically-in-windows-7-or?forum=windowssdk)
Notice that your application will need to be running with Administrative access in order to share a folder.

Applying a snapshot in Hyper-V WMI V2 from C#

I am trying to replicate the following PowerShell in C#:
# Details from here are not particularly important but needed for full sample
$vms = gwmi -namespace "root\virtualization\v2" Msvm_ComputerSystem
$vm = $vms[3]
$snapshot = ($vm.GetRelated("Msvm_VirtualSystemSettingData") | Where { $_.ElementName -eq "SnapshotName" })[0]
# end unimportant
$VMSS = Get-WMiObject -class Msvm_VirtualSystemSnapshotService -namespace root\virtualization\v2
$VMSS.ApplySnapshot($snapshot, $null)
This code works fine - the snapshot applies as expected.
I have no problem getting the Msvm_VirtualSystemSettingData instance or a Msvm_VirtualSystemSnapshostService instance in C#. However, I can't seem to get the call to ApplySnapshot right - no matter what I give it I get an InvalidOperationException. I'm using generated WMI code from Visual Studio for the call:
public uint ApplySnapshot(ref System.Management.ManagementPath Job, System.Management.ManagementPath Snapshot) {
if ((isEmbedded == false)) {
System.Management.ManagementBaseObject inParams = null;
inParams = PrivateLateBoundObject.GetMethodParameters("ApplySnapshot");
// following line has been through variations as well with no change -
// commenting it out, setting to null
inParams["Job"] = ((System.Management.ManagementPath)(Job)).Path;
inParams["Snapshot"] = ((System.Management.ManagementPath)(Snapshot)).Path;
System.Management.ManagementBaseObject outParams = PrivateLateBoundObject.InvokeMethod("ApplySnapshot", inParams, null);
Job = ((System.Management.ManagementPath)(outParams.Properties["Job"].Value));
return System.Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);
}
else {
return System.Convert.ToUInt32(0);
}
}
I'm not sure what to pass for the Job parameter either, since we get a job back - it's very unusual to have a ref for that instead of an out but I've tried a bunch of different variations around that (including setting the parameter to null and not setting it at all) with no luck. I've also tried setting inParams[Job] to null with no luck for that either.
What should I change to make this work?
I believe your problem is that you are passing in the job to start with when it is an outbound parameter. That parameter will return from the invocation. Something like..
ManagementBaseObject inParams = null;
inParams = PrivateLateBoundObject.GetMethodParameters("ApplySnapshot");
inParams["Snapshot"] = ((System.Management.ManagementPath)(Snapshot)).Path;
ManagementBaseObject outParams = PrivateLateBoundObject.InvokeMethod("ApplySnapshot", inParams, null);
// i left this as i assume this is vs generated though this isn't how i would normally
// get my jobs back.
Job = ((ManagementPath)(outParams.Properties["Job"].Value));
return Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);

Using WMI to create active directory dns zones

I'm using the following code to create a DNS zone:
ManagementClass zoneObj = new ManagementClass(session, new ManagementPath("MicrosoftDNS_Zone"), null);
ManagementBaseObject inParams = zoneObj.GetMethodParameters("CreateZone");
inParams["ZoneName"] = "thedomain.com";
inParams["ZoneType"] = 0;
ManagementBaseObject outParams = zoneObj.InvokeMethod("CreateZone", inParams, null);
This creates the zone, but creates it with the type "Standard Primary". I need it to create with the type "Active Directory - Integrated Primary". From all my research, the zone type of "0" should do this. Can anyone tell me why it won't create the zone as an active directory zone?
I figured it out. Anyone else with the same issue, you have to add the DsIntegrated parameter to tell it to use Active Directory. Here is the final code:
ManagementClass zoneObj = new ManagementClass(session, new ManagementPath("MicrosoftDNS_Zone"), null);
ManagementBaseObject inParams = zoneObj.GetMethodParameters("CreateZone");
inParams["ZoneName"] = "thedomain.com";
inParams["ZoneType"] = 0;
inParams["DsIntegrated"] = true; //--- this is what needed to be added
ManagementBaseObject outParams = zoneObj.InvokeMethod("CreateZone", inParams, null);
DsIntegrated
Indicates whether zone data is stored in the Active Directory or in files. If TRUE, the data is stored in the Active Directory; if FALSE, the data is stored in files.

Enabling filestream with WMI and C#

I have need to enable FILESTREAM on a SQL Server through a program. According to documentation I have found, this can be done through WMI with the following code:
set fsInstance = GetObject("WINMGMTS:\\" & MachineName & "\root\Microsoft\SqlServer\ComputerManagement10:FilestreamSettings='" & InstanceName & "'")
Set method = fsInstance.Methods_("EnableFilestream")
Set inParam = method.inParameters.SpawnInstance_()
inParam.AccessLevel = TargetLevel
inParam.ShareName = ShareName
Set outParam = fsInstance.ExecMethod_("EnableFilestream", inParam)
Converting this to C#, I get the following:
ManagementClass mc = new ManagementClass(new ManagementScope(#"\\.\root\Microsoft\SqlServer\ComputerManagement10"),
new ManagementPath("FilestreamSettings"),
new ObjectGetOptions(new ManagementNamedValueCollection() {
{"InstanceName", "MSSQLSERVER"}
}));
ManagementBaseObject inParams = mc.GetMethodParameters("EnableFilestream");
inParams["AccessLevel"] = 1;
inParams["ShareName"] = "ALLIANCE";
mc.InvokeMethod("EnableFilestream", inParams, null);
Whenever I try this, though, it throws an exception on InvokeMethod. The message is "Invalid method parameter(s)". I have attempted to remove the two lines where I set AccessLevel and ShareName and run it that way, but get the same exception. What am I doing wrong here?

Categories