zmiana hasła użytkownika w kontexcie innego użytkownika

repairprzykładowy scenariusz:

dostęp do sieci klienta via VPN. nie ma możliwości zmiany hasła podczas połączenia VPN, ponieważ to niekoszerne rozwiązanie. hasło wygasło. inny pracownik ma swoje konto nadal aktywne – czy da się zmienić szybko hasło, zamiast czekać aż helpdesk przetrawi ticket?

dostępne opcje(, które raczej nie zadziałają):

  • połączyć się RDP do DC. w przeciwieństwie do połączenia do member servera, podczas połączenia do DC jest możliwość zmiany wygasłego hasła. warunek jest taki, że trzeba mieć uprawnienia do logowania na DC, czyli zazwyczaj – być Domain Adminem.
  • w starym wpisie na stronach Technet znajdujemy opis, że można zmienić hasło przy pomocy 'net user * /domain’. jest to niekompetencja osoby piszącej KB, ponieważ nie odróżnia ona 'reset password’ od 'change password’. przy pomocy net user można hasło wyłącznie zresetować, co wiąże się z posiadaniem odpowiednich uprawnień do konta, na którym wykonuje się operację. dalszy opis w tym KB jest również bzdurą, ponieważ uprawnienia domain admina nie są wymagane – można to skonfigurować nawet dla pojedynczych kont.

rozwiązanie

jest oczywiście sposób skuteczny, działający i niewymagający żadnych specjalnych uprawnień. i oczywiście przy pomocy PowerShell, a konkretnie commandleta Set-ADAccountPassword:

Set-ADAccountPassword -Identity <user-with-expired-password> -OldPassword (ConvertTo-SecureString -AsPlainText "OLDPASSWORD" -Force) -NewPassword (ConvertTo-SecureString -AsPlainText "NEWPASSWORD" -Force)

sprawdzałem dla PS 2.o i wystarczy.

eN.

szybkie wyszukiwanie plików w PowerShell

Windows_PowerShell_iconjest kilka takich narzędzi commanline w Linux, których braqje w Windows. jednym jest 'du’ czyli Disk Usage liczący wielkość katalogu. to można sobie łatwo oprogramować:

(ls -r -force <dir> -ea silentlycontinue|measure -property length -sum).sum/1GB

to oczywiście na szybko, można to upiększać, dodać skrypt dostępny globalnie – prościzna. drugim bardzo często narzędziem, z którego często korzystałem było 'locate’. w Linuxie super przydatne głównie z tego powodu, że każde distro się różni i pliki są rozpizgane po setkach katalogów. Linuxowa masakra. ale locate przeważnie jest a to poważnie ułatwia życie. idea jest taka sama jak w Windows – działa sobie indexer, który skanuje katalogi i tworzy indexy dla pliqw. można go wymusić do odświeżenia przy pomocy 'updatedb’. w Windows jest 'Windows Search’, czyli WSearch [w wXP był Indexing Service]. problem polega na tym, że nie ma standardowych narzędzi commandline. co prawda jest od jakiegoś czasu moduł WindowsSearch ale służy wyłącznie do konfiguracji usługi. w starym Windows Desktop Search był trick na skorzystanie z linii poleceń. jeśli jest w nowej wersji – nie znam go.

oczywiście jest API. a to daje możliwość oprogramowania sobie searcher. doqmentacja dot. tworzenia zapytań jest na MSDN. a przykładowy draft skryptu tu:

locate-File.ps1

<#
.SYNOPSIS
  locate function to quickly find files using windows search index
.NOTES
  author: nExoR 2o14
  version: 03.11.2o14
.IDEAS
    add search parameters:
     - search for file contents
     - only in specyfic files [doc/pdf]
.EXAMPLE
    locate-file *hidden*.ps1
.LINK
  https://w-files.pl
  http://blogs.technet.com/b/heyscriptingguy/archive/2010/05/30/hey-scripting-guy-weekend-scripter-using-the-windows-search-index-to-find-specific-files.aspx
  https://msdn.microsoft.com/en-us/library/bb231256%28v=VS.85%29.aspx
#>

param(
  [parameter(mandatory=$true)][string]$fileName,
  [int]$pageSize=20000
)

$fileName=$fileName.Replace('*','%')
$query = "SELECT `
    System.ItemName, system.ItemPathDisplay, System.ItemTypeText,System.DateCreated,System.DateModified,`
    System.FileAttributes,System.FileOwner,System.Size `
        FROM SystemIndex where system.fileName LIKE '$fileName'"

#https://social.technet.microsoft.com/Forums/scriptcenter/en-US/c262d5de-da6b-4e9e-9aab-2965f3109b8a/vbs-looking-for-script-to-change-windows-search-property?forum=ITCG        
$ADOCommand = New-Object -ComObject adodb.command
$ADOConnection = New-Object -ComObject adodb.connection
$RecordSet = New-Object -ComObject adodb.recordset
$ADOConnection.open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';")
$RecordSet.pageSize=$pageSize
$RecordSet.open($query, $ADOConnection)
Try { $RecordSet.MoveFirst() }
Catch [system.exception] { "no records returned" }
while(-not($RecordSet.EOF))
{
  if($locatedFile){Remove-variable locatedFile}
  $locatedFile=new-object -typeName PSObject
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Name' -Value ($RecordSet.Fields.Item("System.ItemName")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Path' -Value ($RecordSet.Fields.Item("System.ItemPathDisplay")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Type' -Value ($RecordSet.Fields.Item("System.ITemTypeText")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'DateCreated' -Value ($RecordSet.Fields.Item("System.DateCreated")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'DateModified' -Value ($RecordSet.Fields.Item("System.DateModified")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'FileAttributes' -Value ($RecordSet.Fields.Item("System.FileAttributes")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'FileOwner' -Value ($RecordSet.Fields.Item("System.FileOwner")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Size' -Value ($RecordSet.Fields.Item("System.Size")).value
  $locatedFile
 $RecordSet.MoveNext()
}

$RecordSet.Close()
$ADOConnection.Close()
$RecordSet = $null
$ADOConnection = $null
[gc]::collect()

to oczywiście wersja robocza. proof of concept. napisane tak, żeby zwracało ładne obiekty. ogólna idea to podłączenie się do bazy zawierającej indexy przy pomocy ADO i wykonanie kwerendy. wyniki podawane są niemal natychmiast tylko trzeba pamiętać, że są tam wyłącznie katalogi zindexowane – jeśli chcemy móc wyszukiwać po całym dysq, to trzeba dodać cały dysk do indexowania…

…a jeśli nie zależy nam na czasie to można szukać 'po staremu’:

ls <dir> -r -force -ea silentlycontinue <file-to-search>

eN.

 

 

gmail: niedochodzące maile

wielokrotnie zgłaszały się do mnie osoby, którym poginęły [nie doszły] maile do skrzynki gmail. ponieważ ostatnio dopadło i mnie, i to w dość ważnej sprawie, sprawdziłem czy nie jest to przypadkiem wina RBLi. i wychodzi, że jest.

nie ma nigdzie oficjalnej informacji, z których list RBL google korzysta, ale na kilq site’ach zajmujących się tym tematem [np. link1, link2] znalazłem informację iż są to:

  • pbl.spamhaus.org
  • sbl.spamhaus.org
  • xbl.spamhaus.org
  • cbl.abuseat.org

…czyli głównie spamhouse. i po sprawdzeniu adresu nadawcy – faktycznie jest zarejestrowany przez spamhouse. osobiście wolałbym żeby maile wpadały do spamu, niż po prostu znikały pomimo, że nadawcę mam kontaktach, czyli na whiteliście /:

w przypadq outlook.com znalazłem informację, iż jest wykorzystywany wewnętrzny forefront w domenie bigfish.com .

eN.