Как обнаружить, если машина соединена с доменом?

Как я обнаруживаю, соединена ли машина с доменом Active Directory (по сравнению с в режиме Workgroup)?

56
задан Tim Cooper 24 July 2019 в 18:56
поделиться

4 ответа

Вы можете использовать PInvoke для Win32 API, например NetGetDcName , который вернет пустую / пустую строку для машины, не присоединенной к домену.

Еще лучше NetGetJoinInformation , который точно скажет вам, если машина не подключена, в рабочей группе или в домене.

Используя NetGetJoinInformation Я собрал это, что сработало для меня:

public class Test
{
    public static bool IsInDomain()
    {
        Win32.NetJoinStatus status = Win32.NetJoinStatus.NetSetupUnknownStatus;
        IntPtr pDomain = IntPtr.Zero;
        int result = Win32.NetGetJoinInformation(null, out pDomain, out status);
        if (pDomain != IntPtr.Zero)
        {
            Win32.NetApiBufferFree(pDomain);
        }
        if (result == Win32.ErrorSuccess)
        {
            return status == Win32.NetJoinStatus.NetSetupDomainName;
        }
        else
        {
            throw new Exception("Domain Info Get Failed", new Win32Exception());
        }
    }
}

internal class Win32
{
    public const int ErrorSuccess = 0;

    [DllImport("Netapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern int NetGetJoinInformation(string server, out IntPtr domain, out NetJoinStatus status);

    [DllImport("Netapi32.dll")]
    public static extern int NetApiBufferFree(IntPtr Buffer);

    public enum NetJoinStatus
    {
        NetSetupUnknownStatus = 0,
        NetSetupUnjoined,
        NetSetupWorkgroupName,
        NetSetupDomainName
    }

}
28
ответ дан 26 November 2019 в 17:04
поделиться
ManagementObject cs;
        using(cs = new ManagementObject("Win32_ComputerSystem.Name='" + System.Environment.MachineName + "'" ))
        {
            cs.Get();
            Console.WriteLine("{0}",cs["domain"].ToString());
        }

Это должно позволить вам получить домен. Я считаю, что он будет пустым или пустым, если вы являетесь частью рабочей группы, а не доменом.

Не забудьте указать System.Management

7
ответ дан 26 November 2019 в 17:04
поделиться

Переменные среды могут работать на вас.

Environment.UserDomainName

Ссылка MSDN для получения дополнительных сведений.

Environment.GetEnvironmentVariable("USERDNSDOMAIN")

Я не уверен, что эта переменная среды существует, не будучи в домене.

Поправьте меня, если я ошибаюсь, фанаты администраторов Windows - я считаю, что компьютер может находиться в нескольких доменах, поэтому может быть важнее знать, в каком домене, если таковой имеется, вы находитесь, а не в any домен.

4
ответ дан 26 November 2019 в 17:04
поделиться

Если вы шифруете данные, вы должны спросить себя, кто будет расшифровывать их. При использовании асимметричной системы шифрования (например, RSA) шифрование использует открытый ключ, а расшифровка - соответствующий закрытый ключ; «асимметрия» происходит от того, что закрытый ключ не может быть повторно вычислен из открытого ключа (хотя оба ключа математически связаны вместе).

Асимметричное шифрование, как правило, имеет служебные данные. Первое замечание состоит в том, что такое шифрование должно иметь некоторую случайную часть в нем, потому что каждый может шифровать (открытый ключ, да, открытый): если процесс шифрования детерминирован, то любой может зашифровать все возможные SSN (их меньше миллиарда, что для современного компьютера действительно небольшое число) и сопоставить зашифрованные значения. Следовательно, во время шифрования должно быть добавлено некоторое количество случайных данных, и зашифрованный SSN больше, чем открытый SSN.

Известные асимметричные системы шифрования используют математические структуры, которые имеют свои собственные затраты. В основном, для системы шифрования RSA с «достаточно сильным» ключом зашифрованное сообщение будет иметь длину не менее 128 байт. Некоторые системы шифрования работают лучше; придерживаясь хорошо шагавших путей научного исследования, я мог сделать это приблизительно в 41 байте (с Эль-Джамалем по NIST K-163 овальная кривая). Поменьше кажется сложнее.

Поэтому неудивительно, что данная система баз данных не будет включать такую функцию по умолчанию.

Для вашей проблемы, вы должны сначала определить (и написать), как вы можете:

  • какие данные вы хотите защитить
  • кто вводит данные
  • кто должен читать данные обратно

, а затем только вы должны спросить себя, является ли шифрование правильным инструментом для этого. Шифрование хорошо, когда предполагаемый злоумышленник может получить руки от необработанных, сохраненных данных. Это означает, что злоумышленник обошел защиту операционной системы. В этот пункт, что бы ни знала операционная система, злоумышленник тоже знает. Если база данных размещена на машине и есть интерфейс, через который можно получить расшифрованный SSN, то эта машина «знает», как получить данные, и атакующий тоже... С другой стороны, если операционная система хост-машины считается достаточно устойчивой, то шифрование, похоже, вообще не нужно.

Симметричное шифрование базы данных может решить более слабую проблему, при которой злоумышленник получает копию жесткого диска после . Хост-система знает симметричный ключ шифрования, но знает его только в оперативной памяти. У злоумышленника, который украл жесткий диск, не будет этого ключа.

-121--3995649-

При переходе в диалоговое окно «Добавить» выберите файл, затем вместо нажатия кнопки «Добавить» щелкните стрелку раскрывающегося списка и выберите «Добавить как ссылку»:

alt text

Файл будет сохранен в исходном расположении, а не скопирован и импортирован в текущий проект.

-121--4817478-

Не дурачитесь пинвоке, если вам не нужно.

Ссылка на System.StartServices, затем вызовите:

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()

Создает ActiveObjectNotFoundException , если компьютер не присоединен к домену. Возвращенный объект Domain содержит искомое свойство Name.

92
ответ дан 26 November 2019 в 17:04
поделиться