Программное присоединение компьютера Windows к домену AD

Volatile говорит компилятору не оптимизировать ничего, что связано с переменной volatile.

Существует только одна причина использовать его: при взаимодействии с оборудованием.

Допустим, у вас есть небольшой аппарат, который где-то отображается в ОЗУ и имеет два адреса: командный порт и порт данных:

typedef struct
{
  int command;
  int data;
  int isbusy;
} MyHardwareGadget;

Теперь вы хотите отправить некоторое команда:

void SendCommand (MyHardwareGadget * gadget, int command, int data)
{
  // wait while the gadget is busy:
  while (gadget->isbusy)
  {
    // do nothing here.
  }
  // set data first:
  gadget->data    = data;
  // writing the command starts the action:
  gadget->command = command;
}

Выглядит просто, но может потерпеть неудачу, потому что компилятор может свободно изменять порядок записи данных и команд. Это заставит наш маленький гаджет выдавать команды с предыдущим значением данных. Также взгляните на ожидание при занятом цикле. Этот будет оптимизирован. Компилятор попытается быть умным, прочитает значение isbusy только один раз и затем перейдет в бесконечный цикл. Это не то, что вы хотите.

Чтобы обойти это, нужно объявить гаджет указателя как изменчивый. Таким образом, компилятор вынужден делать то, что вы написали. Он не может удалить назначения памяти, он не может кэшировать переменные в регистрах и не может изменить порядок назначений:

Это правильная версия:

   void SendCommand (volatile MyHardwareGadget * gadget, int command, int data)
    {
      // wait while the gadget is busy:
      while (gadget->isbusy)
      {
        // do nothing here.
      }
      // set data first:
      gadget->data    = data;
      // writing the command starts the action:
      gadget->command = command;
    }
7
задан Community 23 May 2017 в 11:54
поделиться

1 ответ

Хорошо мало обновления после всех этих лет, если кому-то был бы нужен он.

WMI больше не содержит JoinDomain только рабочая группа (WIN 10, Сборка 1909). Можно использовать netapi32.dll

[еще 114] информация здесь:

https://docs.microsoft.com/en-us/windows/win32/api/lmjoin/nf-lmjoin-netjoindomain

Мало быстрого примера:

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    [DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
    static extern uint NetJoinDomain(
          string lpServer,
  string lpDomain,
  string lpAccountOU,
  string lpAccount,
  string lpPassword,
      JoinOptions NameType);

    [Flags]
    enum JoinOptions
    {
        NETSETUP_JOIN_DOMAIN = 0x00000001,
        NETSETUP_ACCT_CREATE = 0x00000002,
        NETSETUP_ACCT_DELETE = 0x00000004,
        NETSETUP_WIN9X_UPGRADE = 0x00000010,
        NETSETUP_DOMAIN_JOIN_IF_JOINED = 0x00000020,
        NETSETUP_JOIN_UNSECURE = 0x00000040,
        NETSETUP_MACHINE_PWD_PASSED = 0x00000080,
        NETSETUP_DEFER_SPN_SET = 0x10000000
    }

    public static uint domainjoin(string server, string domain, string OU, string account, string password)
    {
        try
        {
            uint value1 = NetJoinDomain(server, domain, OU, account, password, (JoinOptions.NETSETUP_JOIN_DOMAIN | JoinOptions.NETSETUP_DOMAIN_JOIN_IF_JOINED | JoinOptions.NETSETUP_ACCT_CREATE));
            return value1;
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
            return 11;
        }
    }


    private void Button_Click(object sender, RoutedEventArgs e)
    {

        var succes = domainjoin(null, "mydomain.local", null, "administrator", "UltraSecretPasword");
        MessageBox.Show(succes.ToString());

    }
}
1
ответ дан 7 December 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: