Выйти из системы всех пользователей:
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 элементов в зависимости от того, подключены пользователи или отключены от сеанса терминала Где могут быть сторонние типы? Возможно, вы захотите провести различие между типами, которые утверждают, что они предоставляются 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;
}
Подобно ответу Мехрдада, но допускает ту же проверку, даже если код выполняется в каком-то другом приложении.
obj.GetType().Assembly == typeof(SomeTypeYouKnowIsInYourAssembly).Assembly
obj.GetType().Assembly == System.Reflection.Assembly.GetExecutingAssembly()
Проверяет, объявлен ли тип в текущей сборке.
Исправлено! Код должен быть с отступом в четыре пробела, а не в три!
Я сделал несколько правок, чтобы проверить это, прежде чем задавать вопрос, но похоже, что Firefox кэшировал страницу как тестовую публикацию. Поскольку я использовал сочетание клавиш Windows для принудительной перезагрузки страницы, а не сочетание клавиш Mac, ооо!
Я заметил, что это работает, когда я сделал новый тестовый пост, разочарованный четырьмя пробелами, а затем изучил источник страницы.
Web.RegularExpressionsPublicKeyToken = 31bf3856ad364e35
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");
}