Как я могу скопировать New-SmbGlobalMapping в коде C #? - PullRequest
2 голосов
/ 02 июля 2019

Я пишу сервис, который управляет докерными контейнерами. Я хочу иметь подключенный том в качестве общего ресурса Azure и, следовательно, использовать глобальное сопоставление SMB. Если я использую обычный WNetAddConnection2A, я могу просто смонтировать общий ресурс в моем коде, но контейнеры не могут его увидеть, так как он не «глобальный». Я не могу найти источник для команды PowerShell New-SmbGlobalMapping (есть ли способ увидеть это?), И я не могу найти подходящий API для вызова. Я надеюсь, что кто-то знает магическое заклинание, которое я могу вставить в мой код .NET.

1 Ответ

2 голосов
/ 02 июля 2019

Я не могу найти источник для команды PowerShell New-SmbGlobalMapping (есть ли способ увидеть это?), и я не могу найти подходящий API для вызова. я надеюсь, кто-то знает магическое заклинание, которое я могу вставить в свой код .NET.

PowerShell использует WMI

В вашем случае это вызывает Создать метод класса MSFT_SmbMapping (точно MSFT_SmbGlobalMapping )

Вы можете использовать WMI Code Creator для генерации / тестирования кода C #


РЕДАКТИРОВАТЬ : тест с PowerShell. Создать

  • Test as Admin (" requireAdministrator " в манифесте) в Windows 10
  • Тестовый код (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...