Обнаружьте, если тип объекта является типом, определенным Платформой.NET

Выйти из системы всех пользователей:

try {
   query user /server:$SERVER 2>&1 | select -skip 1 | foreach {
     logoff (

Выйти из системы всех пользователей:

[110]

Подробности:

  • try / catch используется, когда на сервере нет пользователей и query возвращает ошибку. тем не менее, вы можете удалить часть 2>&1 и удалить try / catch, если вы не против увидеть строку ошибки
  • select -skip 1 удаляет строку заголовка
  • внутренний foreach выходит из системы каждого пользователя
  • (

    Выйти из системы всех пользователей:

    [110]

    Подробности:

    • [111] / [112] используется, когда на сервере нет пользователей и [113] возвращает ошибку. тем не менее, вы можете удалить часть [114] и удалить [115] / [116], если вы не против увидеть строку ошибки
    • [117] удаляет строку заголовка
    • внутренний [118] выходит из системы каждого пользователя
    • [119] разбивает строку на массив только с текстовыми элементами этого массива, вам нужно сделать это, потому что вывод query будет иметь 8 или 9 элементов в зависимости от того, подключены пользователи или отключены от сеанса терминала
    -split "\s+")
    разбивает строку на массив только с текстовыми элементами этого массива, вам нужно сделать это, потому что вывод query будет иметь 8 или 9 элементов в зависимости от того, подключены пользователи или отключены от сеанса терминала
-split "\s+")[-6] /server:$SERVER } } catch {}

Подробности:

  • try / catch используется, когда на сервере нет пользователей и query возвращает ошибку. тем не менее, вы можете удалить часть 2>&1 и удалить try / catch, если вы не против увидеть строку ошибки
  • select -skip 1 удаляет строку заголовка
  • внутренний foreach выходит из системы каждого пользователя
  • (

    Выйти из системы всех пользователей:

    [110]

    Подробности:

    • [111] / [112] используется, когда на сервере нет пользователей и [113] возвращает ошибку. тем не менее, вы можете удалить часть [114] и удалить [115] / [116], если вы не против увидеть строку ошибки
    • [117] удаляет строку заголовка
    • внутренний [118] выходит из системы каждого пользователя
    • [119] разбивает строку на массив только с текстовыми элементами этого массива, вам нужно сделать это, потому что вывод query будет иметь 8 или 9 элементов в зависимости от того, подключены пользователи или отключены от сеанса терминала
    -split "\s+")
    разбивает строку на массив только с текстовыми элементами этого массива, вам нужно сделать это, потому что вывод query будет иметь 8 или 9 элементов в зависимости от того, подключены пользователи или отключены от сеанса терминала
12
задан DOK 7 June 2009 в 19:43
поделиться

4 ответа

Где могут быть сторонние типы? Возможно, вы захотите провести различие между типами, которые утверждают, что они предоставляются Microsoft, и типами, которые этого не делают.

using System;
using System.Linq;
using System.Reflection;

class Test
{
    static void Main()
    {
        Console.WriteLine(IsMicrosoftType(typeof(string)));
        Console.WriteLine(IsMicrosoftType(typeof(Test)));
    }

    static bool IsMicrosoftType(Type type)
    {
        object[] attrs = type.Assembly.GetCustomAttributes
            (typeof(AssemblyCompanyAttribute), false);

        return attrs.OfType<AssemblyCompanyAttribute>()
                    .Any(attr => attr.Company == "Microsoft Corporation");
    }
}

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

В качестве альтернативы вы можете использовать токен открытого ключа сборки. Это, вероятно, будет сложнее подделать. Он полагается на то, что Microsoft использует общий открытый ключ для всех своих сборок, чего они не делают (согласно приведенному ниже комментарию Мехрдада). Однако вы можете легко адаптировать это решение для набора принятых открытых ключей «это от Microsoft». Возможно, объедините эти два подхода как-нибудь и сообщите о любых различиях для дальнейшего изучения ...

static bool IsMicrosoftType(Type type)
{
    AssemblyName name = type.Assembly.GetName();
    byte[] publicKeyToken = name.GetPublicKeyToken();

    return publicKeyToken != null
        && publicKeyToken.Length == 8
        && publicKeyToken[0] == 0xb7
        && publicKeyToken[1] == 0x7a
        && publicKeyToken[2] == 0x5c
        && publicKeyToken[3] == 0x56
        && publicKeyToken[4] == 0x19
        && publicKeyToken[5] == 0x34
        && publicKeyToken[6] == 0xe0
        && publicKeyToken[7] == 0x89;
}
17
ответ дан 2 December 2019 в 03:29
поделиться

Подобно ответу Мехрдада, но допускает ту же проверку, даже если код выполняется в каком-то другом приложении.

obj.GetType().Assembly == typeof(SomeTypeYouKnowIsInYourAssembly).Assembly
8
ответ дан 2 December 2019 в 03:29
поделиться
obj.GetType().Assembly == System.Reflection.Assembly.GetExecutingAssembly()

Проверяет, объявлен ли тип в текущей сборке.

7
ответ дан 2 December 2019 в 03:29
поделиться

Исправлено! Код должен быть с отступом в четыре пробела, а не в три!

Я сделал несколько правок, чтобы проверить это, прежде чем задавать вопрос, но похоже, что Firefox кэшировал страницу как тестовую публикацию. Поскольку я использовал сочетание клавиш Windows для принудительной перезагрузки страницы, а не сочетание клавиш Mac, ооо!

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

Web.RegularExpressions
  • System.Web.Services
  • Microsoft.Transactions.Bridge
  • Microsoft.Transactions.Bridge.Dtc
  • Microsoft.Build.Tasks.v3.5
  • Microsoft.CompactFramework.Build. Задачи
  • Microsoft.Data.Entity.Build.Tasks
  • Microsoft.VisualC.STLCLR
  • Sentinel.v3.5Client
  • PublicKeyToken = 31bf3856ad364e35

    • PresentationCFFRasterizer [1214814] PresentationUI следующий код:

          private void PrintAssemblyInfo(string fullName)
          {
              string[] parts = fullName.Split(',');
              Console.WriteLine(" - {0}, {1}", parts[0], parts[3]);
          }
      
          private void GenerateInfo(string path)
          {
              foreach (var file in Directory.GetFiles(path, 
                 "*.dll",
                 SearchOption.AllDirectories))
              {
                  try
                  {
                      Assembly assembly = Assembly.ReflectionOnlyLoadFrom(file);
                      PrintAssemblyInfo(assembly.GetName().FullName);
                  }
                  catch { }
              }
          }
      
          private void GenerateInfo()
          {
              GenerateInfo(@"C:\Windows\Microsoft.NET\Framework\v2.0.50727");
              GenerateInfo(@"C:\Windows\Microsoft.NET\Framework\v3.0");
              GenerateInfo(@"C:\Windows\Microsoft.NET\Framework\v3.5");
          }
      
    11
    ответ дан 2 December 2019 в 03:29
    поделиться
    Другие вопросы по тегам:

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