Estoy escribiendo un servicio que controla los contenedores acoplables. Quiero tener el volumen montado como un recurso compartido de Azure y, por lo tanto, necesito usar la asignación global de SMB. Si uso el WNetAddConnection2A habitual, puedo montar el recurso compartido sin problemas en mi código, pero los contenedores no pueden verlo porque no es "global". No puedo encontrar la fuente para el comando PowerShell New-SmbGlobalMapping (¿hay alguna forma de verlo?) y no puedo encontrar una API adecuada para llamar. Espero que alguien sepa el conjuro mágico que puedo poner en mi código .NET.
No puedo encontrar la fuente para el comando PowerShell New-SmbGlobalMapping (¿hay alguna forma de verlo?) y no puedo encontrar una API adecuada para llamar. Espero que alguien sepa el conjuro mágico que puedo poner en mi código .NET.
PowerShell usa WMI
En su caso, llama al método Create de la clase MSFT_SmbMapping (exactamente MSFT_SmbGlobalMapping )
Puede usar WMI Code Creator para generar/probar código C#
EDITAR : prueba con PowerShell.Create
// PowerShell calls CredUIPromptForCredentialsW to display the User/Password dialog (you can call it with P/Invoke if needed) string sUser = "user@provider.com"; string sPassword = "myPassword"; System.Net.NetworkCredential networkCredential = new System.Net.NetworkCredential(sUser, sPassword, null); System.Security.SecureString securePassword = new System.Security.SecureString(); foreach (var c in networkCredential.Password) securePassword.AppendChar(c); // Add reference to : // C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll // Add : // using System.Management.Automation; PSCredential psCredential = new PSCredential(networkCredential.UserName, securePassword); // Error handling must be improved : if I pass an invalid syntax for "RemotePath" or not launched as Admin, // nothing happens (no error, no result) (on Windows 10) string sLocalPath = "Q:"; string sRemotePath = "\\\\DESKTOP-EOPIFM5\\Windows 7"; using (var ps = PowerShell.Create()) { ps.AddCommand("New-SmbGlobalMapping"); ps.AddParameter("LocalPath", sLocalPath); ps.AddParameter("RemotePath", sRemotePath); ps.AddParameter("Credential", psCredential); //ps.AddParameter("RequireIntegrity", false); //ps.AddParameter("RequirePrivacy", false); try { System.Collections.ObjectModel.Collection<PSObject> collectionResults = ps.Invoke(); foreach (PSObject psObl in collectionResults) { Console.WriteLine("Status : {0}", psObl.Members["Status"].Value.ToString()); Console.WriteLine("Local Path : {0}", psObl.Members["LocalPath"].Value.ToString()); Console.WriteLine("Remote Path : {0}\n", psObl.Members["RemotePath"].Value.ToString()); } } catch (ParameterBindingException pbe) { System.Console.WriteLine("\rNew-SmbGlobalMapping error : {0}: {1}", pbe.GetType().FullName, pbe.Message); } } // To get and remove the test mapping in PowerShell : // Get-SmbGlobalMapping // Remove-SmbGlobalMapping -RemotePath "\\DESKTOP-EOPIFM5\Windows 7" -Force