вторник, 15 декабря 2015 г.

How to determine which VHDs are not used on our Hyper-V

[code]
On Error Resume Next
'
' Preparing....
'
Set objFSO=Createobject("Scripting.Filesystemobject")

strFolder="\\n1\c$\ClusterStorage"
strNodeList="n1|n2"
strReplaceTo="c:\"
'
' and go!!!
'
Wscript.Echo "Get list of .VHD and .AVHD files on ClusterShareVolume"
strFileList=Lcase(GetFSVHDList(strFolder))
arrFileList=Split(strFileList,"|")
Wscript.Echo "Done"
Wscript.Echo "Get list of associated VHD files in cluster"
strVHDList=lcase(GetVHDList)
arrVHDList=Split(strVHDList,"|")
Wscript.Echo "Done"
arrNodeList=Split(Lcase(strNodeList),"|")

'
' comparing output
'
For i=LBound(arrFileList) To UBound(arrFileList)
bFound=False
a=lcase(arrFileList(i))
For z=LBound(arrNodeList) To UBound(arrNodeList)
a=Replace(a,"\\" & LCase(arrNodeList(z)) & "\c$\",strReplaceTo)
Next
For j=LBound(arrVHDList) To UBound(arrVHDList)
b=lcase(arrVHDList(j))
If a=b Then bFound=True
Next
If bFound=False Then Wscript.Echo lcase(a)
Next
Wscript.Quit

'
' you can try to understand below lines but you don't need to
'
Function GetFSVHDList(strRootFolder)
On Error Resume Next
Set objFolder=objFSO.GetFolder(strRootFolder)
Set objSubFolders=objFolder.SubFolders
For Each objSubFolder In objSubFolders
strFileList=strFileList & GetFSVHDList(strRootFolder & "\" & objSubFolder.Name)
Next
strFileList=strFileList & GetFSFileList(strRootFolder)
GetFSVHDList=strFileList

End Function

Function GetFSFileList(strRootFolder)
On Error Resume Next
GetFSFileList=""
Set objGFSFLFolder=objFSO.GetFolder(strRootFolder)
Set objGFSFLFiles=objGFSFLFolder.Files
For Each objGFSFLFile In objGFSFLFiles
arrGFSFLFile=Split(UCase(objGFSFLFile.Name),".")
strGFSFLExt=arrGFSFLFile(Ubound(arrGFSFLFile))
If strGFSFLExt="VHD" Or strGFSFLExt="AVHD" Then
GetFSFileList=GetFSFileList & lcase(strRootFolder & "\" & objGFSFLFile.Name) & "|"
End If
Next
End Function

Function GetVHDList
On Error Resume Next
GetVHDList=""
arrNodeList=Split(strNodeList,"|")
For i=Lbound(arrNodeList) To Ubound(arrNodeList)
strComputer=arrNodeList(i)
Set objWMI = GetObject("winmgmts:\\" & strComputer & "\ROOT\virtualization")
strQuery="select * from Msvm_ComputerSystem"
Set col = objWMI.ExecQuery(strQuery)
For Each obj in col
If obj.Name<>obj.ElementName Then
strDisk=GetDisks (obj.Name,strComputer)
a=split(strDisk,"|")
For j=LBound(a) To UBound(a)
GetVHDList=GetVHDList & a(j) & "|"
Next
End If
Next
Next
End Function
Function GetDisks(strSystemName,strComputer)
On Error Resume Next
GetDisks=""
Set objWMIGD = GetObject("winmgmts:\\" & strComputer & "\ROOT\virtualization")
strQuery="SELECT * FROM Msvm_ResourceAllocationSettingData WHERE Parent Like '%" & strSystemName & "%' And ResourceSubType='Microsoft Virtual Hard Disk'"
Set colGD=objWMIGD.ExecQuery(strQuery)
For Each objGD In colGD
For Each objConn In objGD.Connection
GetDisks=GetDisks & objConn & "|"
Next
Next
If GetDisks="|" Then GetDisks="": Exit Function
If Len(GetDisks)>1 Then
If Right(GetDisks,1)="|" Then
GetDisks=Left(GetDisks,Len(GetDisks)-1)
End If
End If
End Function
[/code]

пятница, 11 декабря 2015 г.

Групповые политики и локальные группы (на примере группы локальных администраторов)

Итак, всем известно, что можно переназначать членство в группе локальных администраторов, но не все знают, что механизмов назначения членов группы локальных администраторов два.
Первый - через группы с ограниченным доступом. Конфигурация компьютера - Политики - Конфигурация Windows - Параметры безопасности - Группы с ограниченным доступом. Механизм позволяет четко определить членов группы и этот список не будет изменяться до момента следующего обновления групповой политки (обычно - около 2 часов).
Второй способ - через локальных пользователей и групп. Конфигурация компьютера - Настройка - Панель управления - Локальные пользователи и группы. Механизм позволяет изменять членство в группе, но при этом не переписывая полностью список (точнее - и это тоже можно, но флажок по-умолчанию снят).

Пример:
Допустим, есть политика, в которой через группы с ограниченным доступом указано, что членами группы локальных администраторов будет группа Support.
Тогда после применения групповой политики членами группы будет только группа Support и больше никто. Только локальный админ не будет выпилен.

Если делать по второму способу - то в члены группы (если не устанавливать флажок - очищать содержимое группы) будет добавлена группа Support. Все уже бывшие в ней члены останутся на месте.

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

Ну и немного скрипта, как сбегать по домену и выпилить одного пользователя из локальных админов и запилить другого:
[code]
On Error Resume Next
Set objDomain=Getobject("WinNT://DOMAIN")
For Each domainobject In objDomain
If Lcase(domainobject.Class)="computer" Then
Wscript.Echo domainobject.Name
Err.Clear
Set objPC=Getobject("WinNT://" & domainobject.Name)
'Wscript.Echo Err.Number
If Err.Number=0 Then
Wscript.Echo "connected"
For Each object In objPC
If lcase(object.class)="group" Then
If lcase(object.Name)="администраторы" or lcase(object.Name)="administrators" Then
Wscript.Echo "Group " & object.Name
Err.Clear
object.Add "WinNT://DOMAIN/Support"
object.Remove "WinNT://DOMAIN/UserName"
object.Remove "WinNT://DOMAIN/GroupName1"
If Err.Number=0 Then Wscript.Echo "All done"
End if
End If
Next
Else
Wscript.Echo "no connection"
End If
End If
Next
[/code]

Скрипт можно доработать напильником, чтобы перед соединением с компьютером проверялась его доступность, например с помощью WMI_Ping.

четверг, 3 декабря 2015 г.

среда, 2 декабря 2015 г.

Linux USB over IP Server

Захотелось пробросить внутрь виртуалок USB.
Перетыкал кучу проектов: USBIP, usbredir и еще некоторые, название не вспомню сейчас.
По простоте реализации сильно привлек внимание продукт VirtualHere.
Устанавливается действительно так просто, как написано на оффсайте:
скачал, поменял права, запустил.

Программа на сервере сама находит устройства, в том числе нормально обрабатывает подключение/отключение устройств на лету.

Клиент автоматически сканирует сетку на наличие серверов VirtualHere и самостоятельно цепляется к ним. Можно автоматически подключать устройство с некоторого сервера. Не проверял автоподключение устройства при переподключении его между серверами - было бы интересно.

При подключении нового устройства через сеть потребуется две перезагрузки для установки драйверов.

В общем, впечатления - только положительные.