如何在C#代码中复制New-SmbGlobalMapping?

时间:2019-07-02 11:01:08

标签: powershell docker winapi

我正在写一个控制docker容器的服务。我想将已装载的卷作为Azure共享,因此需要使用SMB全局映射。如果我使用常规的WNetAddConnection2A,则可以在代码中很好地安装共享,但是容器看不到共享,因为它不是“全局”的。我找不到PowerShell New-SmbGlobalMapping命令的源(是否可以查看它?),也找不到合适的API来调用。我希望有人知道我可以在.NET代码中添加的魔咒。

1 个答案:

答案 0 :(得分:2)

  

我找不到PowerShell New-SmbGlobalMapping命令的源   (有没有办法看到它?),我找不到合适的API来调用。一世   希望有人知道我可以在.NET代码中添加的魔咒。

PowerShell使用 WMI

在您的情况下,它会调用 Create method of the MSFT_SmbMapping类(完全是 MSFT_SmbGlobalMapping

您可以使用WMI Code Creator生成/测试C#代码


编辑:使用PowerShell.Create

进行测试
  • 在Windows 10上以管理员身份测试(清单中为“ requireAdministrator ”)
  • 测试代码(C#,VS 2015)=>
    // 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