Modify XML file – find all XML nodes and replace with new value

Recently, I received a request to update multiple software xml files to a newer version for QDAS software.

This request can be done by updating our config XMLs file to our required version. The things here is we need to scan for multiple XML files and look into those to find suitable string (for the nodes name) and replace the value of that node name. This can be done manually for around 200 XML files with 5 records need to be looked in every file (

***A quick count

  • Around 1,000 records need to be checked and updated manually
  • Take up to 10s for look at 1 record and update to the new value.
  • Total 10,000/3600s ~ 2 hours 40 mins continuous working.

Ahhh… this makes no sense for every quarterly update spends time like this …. but the more thing is I am not keen on looking up for each value and do the Ctrl + C and Ctrl +V for all these stuff.

I wrote this below PowerShell to achieve what what I should have lost.

Prerequisite

  • Please backup all your XML file before making the change

Achievement:

  • The Script will make change all the XML files which has the version lower than the one we would like to change, off course, it leave the upper version alone.
  • Generate a log file to track what “Changed”, “NOchange” or “ERROR” to review later.
  • A final summary to give the total Files has been changed/Which files having error while changing.

Function Update-XMLFile ([string]$XMLPath, [string]$XMLNode, [string]$XMLNodeValue,[string]$logpath)
{
    $successcount = 0
    $errorcount = 0
    $nochangecount = 0
    $errorplant = @()
    $XMLNodeValuetoInt = [int]$XMLNodeValue.Replace('_','')
    $XMLNodeValuefind = $XMLNodeValue.substring(0,5) + '*'
    $xmls = Get-ChildItem -path $XMLPath P*.xml -Recurse | ? {$_.basename.length -eq 5}
    foreach ($xml in $xmls){
	write-host "Checking XML File $($xml.basename)" -ForegroundColor Green
	"[INFO]Checking XML File $($xml.basename)"| out-file $logpath\activity.log -Append

        [xml]$xmlcontent = Get-Content $xml.fullname
        $nodes = $xmlcontent.getElementsByTagName($XMLNode)
        If ($null -eq $nodes)
        {
        write-host "Unable to find specific $XMLNode for XMLFile $($xml.basename)" -ForegroundColor Red
        Echo "[ERROR]Unable to find specific $XMLNode for XMLFile $($xml.basename)" | out-file $logpath\activity.log -Append
        }
        Else
        {
            Foreach($node in $nodes){
                write-host "Checking $($node.ParentNode.name)"
                "Checking $($node.ParentNode.name)"| out-file $logpath\activity.log -Append
                try {
                    if(($node.innertext -like $XMLNodeValuefind) -and ([int]$node.innertext.Replace('_','') -ge $XMLNodeValuetoInt)){
                        $OldXmlNodeValue = $node.innertext
                        write-host "[NOChange]$($xml.basename) module $($node.ParentNode.name) Version is already at $OldXmlNodeValue" -ForegroundColor Gray
                        "[NOChange]$($xml.basename) module $($node.ParentNode.name) Version is already at $OldXmlNodeValue" | out-file $logpath\activity.log -Append
                        $nochangecount ++
                    }
                    elseif(($node.innertext -like $XMLNodeValuefind) -and ([int]$node.innertext.Replace('_','') -lt $XMLNodeValuetoInt)){
                        $OldXmlNodeValue = $node.innertext
                        $node.innertext = $XMLNodeValue
                        $xmlcontent.Save($xml.fullname)
                        write-host "[Changed]$($xml.basename) module $($node.ParentNode.name) Updated: $OldXmlNodeValue --> $XMLNodeValue" -ForegroundColor Blue
                        "[Changed]$($xml.basename) module $($node.ParentNode.name) Updated : $OldXmlNodeValue --> $XMLNodeValue" | out-file $logpath\activity.log -Append
                        $successcount ++
                    }
                    else{
                        write-host "[NOChange]$($xml.basename) module $($node.ParentNode.name) Version is not specified"  -ForegroundColor Gray
                        "[NOChange]$($xml.basename) module $($node.ParentNode.name) Version is not specified"  | out-file $logpath\activity.log -Append
                        $nochangecount ++    
                    }
                }
                catch{
                 write-host "$($xml.basename) module $($node.ParentNode.name) can not change version`n $($_.Exception.Message)" -ForegroundColor Red
                "[ERROR]$($xml.basename) module $($node.ParentNode.name) can not change version `n $($_.Exception.Message)" | out-file $logpath\activity.log -Append
                $Errorcount ++
                $errorXMLFile += $xml.basename
                }
	        }
        }
    }
    write-host "Total Files proceed : $($xmls.count)"
    write-host "Total Files proceed Error: $Errorcount / $errorXMLFile"
    write-host "Total Files Modules proceed success: $successcount/$($successcount + $Errorcount)"
    "Total Files proceed : $($xmls.count)"| out-file $logpath\activity.log -Append
    "Total Files proceed Error: $Errorcount / $errorXMLFile"| out-file $logpath\activity.log -Append
    "Total Files Modules proceed success: $successcount/$($successcount + $Errorcount)"| out-file $logpath\activity.log -Append
}

Eg. To call as this
update-xmlfile -XMLPath <FolderPath XMLs Location> -XMLNode "<NodeName>" -XMLNodeValue "<ValueWantUpdateTo>" -logpath "<FolderPath of log file-filename autogenerate>"

Chuyện lúc xưa

Sao nhỉ? Hôm nay là tròn 1 năm ngày mà mọi người trong công ty cũ nhận quyết định sa thải từ ban quản lý…thế là nghỉ việc, mỗi người một ngã. Vài người trong nhóm nhớ lại nên làm tiệc gặp lại cố nhân thế là mọi người gặp lại nhau, người thì xin được việc công ty khác tốt hơn, người thì thất nghiệp, người thì ra buôn bán, người thì ở nhà và nuôi con.

Cái mình thích trong buổi tiệc là không khí của mọi người, làm mình nhớ lại những lần tụ họp nhóm bạn cấp 3, khi mà mọi người chẳng bận tâm gì về vất vả cuộc sống, cạnh tranh cơm áo gao tiền. Hôm nay, mọi người chỉ toàn hỏi thăm nhau, ai cần giúp đỡ gì không thì giới thiệu xin việc này kia, làm ở công ty mới có gì mới không .v.v.. Không khí thật vui và ấm áp.

Nhớ lại ngày khi nhận quyết định, mình không mấy bàng hoàng, không vui cũng chẳng buồn, cũng chẳng hiểu tại sao, chắc mình quen với việc ít thể hiện cảm xúc rồi. Khi nhận quyết định nghỉ, phần là người mới, hạn hợp đồng chỉ có 1 năm. Công ty báo quyết định cho mình làm tới hết hợp đồng thì tự nghỉ, những người khác thì được công ty đền bù 1-2 tháng lương gì đó. Những người làm trên 3 năm thì được hưởng 6 tháng lương, chỉ có mình mình là bị như vậy.

Mình ra đi tay trắng như thế và chuyển việc đến công ty khác chỉ trong 1 tháng sau đó. Có lẽ mình bình thản vì mình tự tin mình sẽ sớm kiếm được chỗ làm mới. Công ty mới này hỏi mình qua sớm được không, nếu dược sẽ thêm 1 tháng bonus tiền vào sớm. Thôi, cũng tạm an ủi vì khả năng của mình vẫn còn được coi trọng.

Đứng dậy và cố gắng tiếp thôi…

CMDB iTOP – create alert for changes in Report with powershell

Recently, I have get some familiar with iTOP which is a central database (CMDB) and will automatically synchronization whatever new changes it takes from surrounding environment to its own database.

The open source application can generate the report as in a routine time we specified : hourly, daily, monthly … sound great !

But One of the challenge I encounter is that this CMDB doesn’t make alert or tracking changes in the report, this mean, it not show up what has been changes from the last day for you to notify.

How about taking a pleasure coffee cup, end up the coffee and we can know what changes had been made since yesterday ?

I have written a native Powershell Script to check the changes in this iTOP subnet Range Report as daily (compare today’s report with the day before – yesterday’s report) with these specifications:

  • Connect to iTOP and download the csv file to local server.
  • Compare 2 version of report file and detect the changes.
  • Send auto-notification Email about the changes (if have) via smtp hub.
  • The script run as schedule daily.
  • Subject of the notification Email display the summary of report (Changes/No Changes and how many changes)
  • It will attach the changes in .csv format
  • Display shortly the change in the body of the email

If detect CHANGES, email notification will look like:

If detect NO CHANGES, email notification will look like:

Content of the script can be look like

# You will need to create the credential for the auto-login, this to decrypt #your ‘get-credential’ input to another unreadable format, somehow to #protect your password.

$Key = [byte]29,36,18,74,72,75,85,52,73,44,0,21,98
$file = “C:\temp\Credentials.crd”
(Get-Credential $AuthUser).Password | ConvertFrom-SecureString -Key $Key | Set-Content $File

#Bind the credential and login to web via the Basic Authentication,
#input the URL has been setup to download the csv report from iTOP

$user = ‘<username>
$file=”C:\temp\Credentials.crd”
$Key = [byte]29,36,18,74,72,75,85,52,73,44,0,21,98,76,99,28
$pass = Get-Content $File | ConvertTo-SecureString -key $key
$pass=[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Pass))
$pair = “$($user):$($pass)”
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
$basicAuthValue = “Basic $encodedCreds”
$Headers = @{
Authorization = $basicAuthValue
}
$uri=”https://itop.xxx.com/web/webservices/export-v2.php?format=csv&login_mode=basic&date_format=Y-m-d+H%3Ai%3As&query=43&#8243;
$currentdate = get-date -f ddMMyy
$path = “C:\temp\ItopCompany\CompanyReport$(get-date -f ddMMyy).csv”
$path1 = “C:\temp\ItopCompany\CompanyReport$([DateTime]::Today.AddDays(-1).ToString(“ddMMyy”)).csv”
$path2 = “C:\temp\ItopCompany\CompanyReport$([DateTime]::Today.AddDays(-2).ToString(“ddMMyy”)).csv”
remove-item -path $path2

Invoke-WebRequest -Uri $uri -Headers $Headers -outfile $path

$today = import-csv $path
$yesterday = import-csv $path1
$missing = Compare-object $today $yesterday -Property ‘REGION.Parent name’,’REGION.Name’,’COUNTRY.Name’,’L.Name’,’L.Company name’,’L.Address’,’L.Postal code’,’L.City’,’L.Country’ | select ‘REGION.Name’,’COUNTRY.Name’,’L.Name’,@{label=”Added/Deleted”;expression={if ($_.SideIndicator -like “<=”){“ADDED”}Else{“DELETED”}}}

$From = “<senderaddress”
$To = “recipientaddress”
$SMTPSerrver = “smtphub.xxx.com”

if ($missing -ne $null)
{
$missing | export-csv C:\temp\ChangesInCompanyReport.csv -notype
$Attachments = “C:\temp\ChangesInCompanyReport.csv”
$Subject = “[$((gc $attachments).count -1) CHANGE]Company Report”
$mess = “There have had $((gc $attachments).count -1) Modifications since yesterday, see below:`n”
$missingmess = $missing | out-file C:\temp\miss.txt
$body = $mess + $(gc “C:\temp\ChangesInCompanyReport.csv”)
$splat = @{
From = $From
To = $To
SMTPServer = $SMTPServer
Subject = $Subject}
Send-MailMessage @splat -Body $Body -attachments $Attachments
}
Else {
$Subject = “[NO CHANGE]Company Report”
$body = “There have NO CHANGE in Report since yesterday”
$splat = @{
From = $From
To = $To
SMTPServer = $SMTPServer
Subject = $Subject}
Send-MailMessage @splat -Body $Body
}

—-END—
If you have any question or inquiries, please don’t hesitate to ask.

Người như tôi

Người mơ hồ giống như tôi, người luôn tìm kiếm gióng như tôi

Người đơn điệu giống như tôi, trước đây đều chẳng thích giả bộ thăng trầm

Tại sao tình cờ nghe một bài nhạc cũ, bỗng nhiên ngây sợ cả người

Người cô đơn giống tôi, người ngốc nghếc giống tôi, người không cam nguyện làm kẻ tầm thường giống tôi

……

Thế gian này có bao người

Retrieve Forest/Domain detail in Active Directory

TABLE OF CONTENT

Scenario

Detail Information

Sample Spreadsheet

Script

SCENARIO

I recently change my position and change to another company. This seem to be a bigger company than the one I used to work in with over 20 domains within a forest and hundred of DCs in each sites.

Things are new to me so that I dig my knowledge try to understand our infrastructure.

Around the Internet, I try to do the research but there is no script that can pull all information in a short way and display all information within a spreadsheet. The things I concern here are the site subnet and FSMO roles of each DCs in that domain – certainly,  it’s not easily to get within only one script.

All the Forest/Domain information We need only achieving by the output of running 3 commands : Get-addomain/Get-adforest and Get-addomaincontroller. That’s the reason I try to make a script that can help me with an overview for the whole domains information in the forest in a shortest way.

Detail Information

Here is some information that can be pulled out within the script:

  • Site name : Name of the site according to Active Directory Sites and Services
  • Created date : date when the site created in Active Directory Sites and Services
  • Domainname : domain name of the site
  • DomainNetbiosname : as its name.
  • Subnet : all subnet details of the according sites. If multiple subnets valid in that domain, they come together with the hyphen
  • DomainMode : domain functional level
  • FSMO Roles : provide the FSMO roles according to that DCs hold which roles. “No roles Assigned” is that the DCs hold no roles, if multiple roles were hold in same DCs, they come together with the hyphen ( *Just a quick Note: Normally, we had 5 FSMO roles in a Domain. But in a Forest, each domain will must have 3 roles RID-PDC-Infrastructure and each forest only have 2 roles Schema-Domain Naming Master )
  • OperatingSystem : Operation System version according to DC
  • Ipaddress : IP address according to that DC
  • IsglobalCatalog : Is that DC a Global Catalog, return True/False
  • ComputerObjectDN : location of the DC in ActiveDirectory Users and Computers

Sample Spreadsheet

DCsInfo

Script

###We will need the Module ActiveDirectory import before running the script

#Create a array to store custome property
$allDCs = @()
#get all the domain name in the forest, we will base on domain name routine to pull all information of the domain in forest.
$Domains = (Get-ADForest).Domains
foreach ($Domain in $Domains)
{
$ADD=Get-ADDomain -identity $Domain
$ADDCs = Get-ADDomainController -Filter * -Server $Domain
foreach($ADDC in $ADDCs){
$siteDN = “CN=” + $ADDC.site + “,CN=Sites,CN=Configuration,DC=testing,DC=com”
$siteOBJ=Get-ADObject -Identity $siteDN -properties *

#if $subnet has multiple value, will try to separate all value with the hypen ‘-‘
$subnet = ($siteobj.siteobjectbl | Get-ADObject).name
if($subnet.count -gt 1){$subnet = [string]::join(“-”, ($subnet))}Else{$subnet=$subnet}
$FSMORoles = $ADDC | select -expandproperty OperationMasterRoles

#if $FSMO roles has multiple value, will try to separate all value with the hypen ‘-‘
if($FSMORoles.count -gt 0) {$FSMORoles = [string]::join(“-”, ($FSMORoles))}Else{$FSMORoles=”No Roles Assigned”}

#Create the PScustom with all value pulled out
$temp = New-Object PSCustomObject -Property @{
‘SiteName’=$ADDC.site
‘CreatedDate’ = $siteOBJ.created
‘DomainControllersname’ = $ADDC.hostname
‘OperatingSystem’ = $ADDC.OperatingSystem
‘ipv4address’=$ADDC.ipv4address
‘domain’ = $ADDC.domain
‘IsGlobalCatalog’ = $ADDC.IsGlobalCatalog
‘IsReadonly’=$ADDC.IsReadonly
‘FSMORoles’= $FSMORoles
‘DomainMode’ = $ADD.DomainMode
‘NetBiosName’ = $ADD.NetBiosName
‘Subnet’ = $subnet
‘ComputerObjectDN’=$ADDC.ComputerObjectDN
}#endNewPSCustomOBj
$AllDCs += $temp
}#end foreach $ADDCs
}#endForEach Domains

#export to csv
$AllDCs | select sitename,createddate,domain,Netbiosname,Subnet,Domainmode,DomainControllersname,FSMOROLES,OperatingSystem,Ipv4address,Isglobalcatalog,ComputerObjectDN | export-csv .\desktop\allDC.csv -notypeinformation

Hai trăm ba mươi ba triệu

Đó là số tiền vnd mà đợt rồi gia đình tôi mua nhà và chi vượt mức khi gặp phải một công ty môi giới với rất nhiều “tài”. Tôi viết bài này cũng nêu một số điều nghiệm ra khi làm việc với giới BĐS này.

Cô em gái nhà tôi xem thông tin nhà trên trang batdongsan.com.vn. Trang web này rất tốt ở khoản thống kê, traffic kha khá và lưu lương bài mới cũng rất nhiều, nói chung là một nguồn tham khảo thích hợp khi cần mua nhà.

Với tài chính trong khoảng 3 tỉ đồng và trong tình thế phải chuyển nhà trong thời gian gấp. Sau khi tìm hiểu rất nhiều nhà bán và đi xem tận mắt khi mà chất lượng nhà hầu như chỉ khoảng 70% so với những mẫu mô tả: căn thì dính lộ giới, căn thì hẻm quá nhỏ và lắt léo, căn thì 2-3 sẹc, căn thì rất tốt nhưng lại khắc hướng nhà thì tinh thần của cả gia đình cũng hơi khủng hoảng. Theo tôi, kiếm nhà không chỉ may mắn mà còn cần cả có duyên nữa.

Nhà của một cty môi giới đăng và gia đình tôi liên lạc, cty BĐS này có luôn cả chìa khóa ra vào nhà nên việc dàn xếp xem nhà rất tự nhiên và nhanh chóng.

Sau khi xem và thấy căn nhà phù hợp : đúng hướng, đủ phòng ngủ và còn khá mới. Gia đình tôi kiếm được nhà như ý nên trong lòng mọi người cũng vui nên không đề phòng bên cty này.

Việc mua nhà theo thỏa thuận 3 tỷ 350tr được chia ra làm 2 đợt: đợt 1 cọc 200tr và đợt 2 trả hết

Đến khi bàn kế hoạch đặt cọc thì có 3 bên : cty môi giới BĐS, 2 ông bà chủ nhà và bên tôi. Lúc này bên tôi thương lượng trực tiếp với chủ để giảm giá căn nhà, cơ bản giảm được 50tr (Thật ra lúc này có sự tác động từ trước của bên cty môi giới tới chủ nhà vì bọn họ biết gia đình tôi đang cần nhà trong thời gian gấp) đồng thời giới hạn số ngày trả lần 2 là sau đó 1 tuần với lý do chủ nhà cần tiền gấp (?) (Sau này mới biết là do bên cty yêu cầu bà này như vậy). Điều này làm gia đình tôi xoay sở không kịp và thiếu 1 tỷ, nhưng do bên cty môi giới lúc này thỏa thuận rất hay và cho gia đình tôi mượn tiền trả nốt số còn lại với lãi suất 3%/tháng. (1 tỷ trả 30tr) nên gia đình tôi đồng ý ngày trả hết tiền đợt 2, những rắc rối cũng từ đây mà ra.

#Chiêu 1:

Sau khi đặt cọc lần 1 và xác định ngày thanh toán tiếp theo thành công. Gia đình tôi tiếp tục gặp cty môi giới này để làm hợp đồng vay 1 tỷ trong 1 tháng lãi suất 3%, nhưng cty môi giới này đòi thêm 1 điều khoản là đồng đứng tên trong hợp đồng mua bán công chứng. Với lý lẽ là do bên tôi cần có tài sản thế chấp để lấy lòng tin, giai đoạn này cty môi giới thuyết phục tôi bằng cách nếu có gì tranh chấp thì tình huống xấu nhất khi đưa ra tòa sẽ chia giá trị căn nhà cho những người đứng tên ( giá trị nhà 3 tỷ 3, gia đình tối đứng tên 2 người, cty môi giới đứng tên 1 người. tổng là 3. Giả sử có tranh chấp thì sẽ là chia cho 3 thành mỗi người 1 tỷ 1 – sẽ không bị lỗ). Thoạt đầu, câu chuyện có vẻ đúng nhưng có những bất lợi

  • Thứ 1 : thật ra giá trị căn nhà là 3 tỷ 3 như đã thương lượng nếu có tranh chấp thì sẽ không có chứng cứ cụ thể khi ra tòa, vì khi ký hợp đồng công chứng không ai ghi giá trị nhiều như vậy. Điều này sẽ bất lợi cho chúng tôi vì có thể giá trị thấp như vậy, bên cty môi giới không đồng ý và hồ sơ cứ treo đó, nhà sẽ bị liệt kê vào tài sản đang tranh chấp – rất khó mua bán.
  • Thứ 2 : Một khi đã cho bên cty môi giới đứng vào, giả sử mọi thứ thuận lợi thì khi làm giấy tờ bên cty môi giới làm giấy tờ tặng lại (giấy tay đã ký từ khi làm hợp đồng vay 1 tỷ để lấy lòng tin cho chúng tôi) cho hai người bên gia đình tôi. Với những Chẳng có gì chắc chắn có thể bên cty môi giới sẽ lần lữa gây khó khăn cho việc làm giấy tờ tặng lại qua hợp đồng công chứng chính thức, đòi thêm một số tiền nữa chẳng hạn nếu không hồ sơ sẽ cứ treo đó, nhà sẽ bị liệt kê vào tài sản đang tranh chấp – rất khó mua bán.
  • Thứ 3 : Giả sử mọi thứ đều tốt và bên cty mối giới đồng ý ký vào giấy tờ tặng lại qua hợp đồng công chứng, 2 người còn lại sở hữu nhà được tặng sẽ phải đóng phần phí thuế thu nhập cá nhân cho người tặng. Điều này sẽ bất lợi vì mình không biết người tặng hiện sở hữu đứng tên bao nhiêu căn nhà và theo luật, từ căn nhà thứ 2 trở lên sẽ phải đóng Thuế thu nhập cá nhân = 2% Giá chuyển nhượng trên hợp đồng mua bán. Tất nhiên, phần này nếu có thì bên tôi cũng sẽ phải đóng chứ bên tặng sẽ không đồng ý chi trả.

#Chiêu 2 :

Bên gia đình tôi sau khi cân nhắc các khả năng có thể nguy hiểm như trên thì quyết định không mượn bên cty môi giới nữa. Tôi đánh liều gọi điện cho chủ nhà trực tiếp thương lượng ngày trả lùi lại thêm 1 tuần nữa sau lễ và hứa sẽ cọc thêm 1 tỷ vào ngày đặt cọc lần hai. May mắn thay, chủ nhà đồng ý và chúng tôi đã xoay xở kịp thời.

Vấn đề ở đây là sau khi thương lượng với chủ nhà, gia đình tôi liên lạc và thông báo với bên cty môi giới là đã giải quyết được với chủ nhà rồi, cty môi giới liên tục nhắc đi nhắc lại là chủ nhà là người không giữ uy tín, hợp đồng cọc đã ký, nếu không trả hết và đợt hai có thể sẽ mất cọc và lúc này bên cty môi giới đưa ra thêm một lựa chọn mới : vay mượn ngân hàng với lãi suất 10%/năm (vay thế chấp nhà của Sacombank) và phát phí tất toán trước hạn là 0% (tức là không phạt). Bên cty môi giới giới thiệu do có người quen làm trong ngân hàng nên thời gian hoàn tất hồ sơ chỉ trong 3-4 ngày, trong lựa chọn này, ngân hàng không cần đồng đứng tên trong hợp đồng mua bán công chứng. Có vẻ mọi việc tốt đẹp rồi, cho đến khi tôi nhớ lại thời hạn thanh toán chỉ là 1 tuần và còn rơi đúng vào dịp lễ giỗ tổ, 30/4 và 1/5. Nếu trong trường hợp ngân hàng không kịp cho vay vào ngày thanh toán đợt 2 (có thể do bên cty môi giới tác động kêu làm chậm lại chẳng hạn), có lẽ việc mượn 1 tỷ nơi khác sẽ rất xa vời và buộc tôi phải quay lại #chiêu 1 của bên cty này. Lúc ấy ai chắc là lãi suất sẽ chỉ là 3% khi gia đình tôi đã hết đường tính.

Sau khi rõ các mánh khóe có thể của cty môi giới BĐS này, tất nhiên, gia đình tôi cũng không muốn dây dưa vì không còn tin tưởng khi giao dịch với cty này nữa. Cuối cùng may mắn gia đình xoay sở được đủ tiền và trả hết phần còn lại vào đợt 2 mà không cần day dưa thêm.

Ngày cọc thứ 2, mọi thứ mới bắt đầu vỡ lỡ:

Dĩ nhiên là khi làm công chứng mua bán nhà, chỉ có hai bên là chủ nhà và gia đình tôi, bên cty môi giới không có liên can gì cả.

Sau khi bên tôi thanh toán đủ tiền cho chủ nhà 3 tỷ 3 và hai bên dùng cơm trưa cùng nhau thì bên cty môi giới tới đòi tiền hoa hồng 1% (33tr của 3 tỷ 3) và số tiền chênh lệch 200tr so với giá chủ nhà kêu ký gửi, tất nhiên là bằng sự de dọa và cả đống anh em xã hội đi theo vào quán ăn trưa.

Chủ nhà kể rằng : Bà đăng bán 3 tỷ 1 . Bên cty môi giới tới đặt cọc 8000$ trước và hẹn sẽ đưa thêm phần còn lại. (mục đích là giữ nhà chờ bán) rồi mượn chìa khóa chủ nhà với lý do dọn dẹp. Trong thời gian đó chờ ngày đưa thêm phần còn lại thì cty này đăng bán và được gia đình tôi liên hệ với giá 3 tỷ 350. Bên cty này đã thương lượng với chủ nhà và nói là đã giới thiệu và bán lại cho người anh của họ (là gia đình tôi) với giá 3 tỷ 350 nên xin kéo dài thời gian ra thêm với chủ nhà (đó cũng là lý do vì sao lần trả thứ 2 của gia đình tôi bị giới hạn trong thời gian ngắn như vậy). Chủ nhà ở giữa cũng khó xử vì hai người đã già cả tầm 70 tuổi rồi, nên đồng ý, chỉ muốn cho xong mọi việc. Ngày đặt cọc tiền đầu tiên của bên tôi, cty môi giới ép chủ nhà trả lại cho họ 8000$ tiền cọc. Sau đó vào ngày thanh toán thứ 2 của gia đình tôi, cty môi giới ép chủ nhà đưa lại 200tr tiền vơi ra (lúc trước đã bán cho họ giá 3 tỷ 1) đồng thời đòi luôn cả tiền hoa hồng 33tr. Tổng tiền bên cty môi giới thu về là 233tr.

Thôi thì cũng là cái duyên, hi vọng việc đổi nhà mới này sẽ là thay đổi tích cực nhất của gia đình tôi trong thời gian tới. Hi vọng và hi vọng…

Welcome to my new view !

IMG_9010

REMOVE MOBILE DEVICES WHICH WAS LONG TIME NO SYNC

 

TABLE CONTENT
Scenario
I. Create list of devices
1.On-Premiese Tenant
-Prerequisite
-Script
2.Office365 Tenant
-Prerequisite
-Script ​
II. Delete long time no sync devices
-Script ​​

SCENARIO:

Let imagine that in a beautiful Sunny days, you get a request on from your Manager that “Hey, We are having so many user making their mobile devices connect to our tenant include both Exchange Online and Exchange On-Premise. You please find a best way to restrain by removing those have not sync for over 1 year.”

Yes, it take me not much time to think about this solution after getting the manager’s requirement and here we start with my favorite tool : Power Shell for Exchange/Exchange Online.

I. Create list of devices

1.On-Premiese Tenant

Prerequisite

  – Login to any servers we can  use Exchange Management Shell

Script 

$Results = @()
#Create the list of tenant mailbox need retrieving devives connect
$MLs = Get-Mailbox -resultsize unlimited | where {$_.ExchangeUserAccountControl -eq “None” -and $_.RecipientTypeDetails -notmatch “SharedMailbox” -and $_.HiddenFromAddressListsEnabled -eq $false }
foreach($ML in $MLs){
$MB = Get-ActiveSyncDeviceStatistics -Mailbox $ML.alias
$MB1 = Get-Mailbox $ML.alias
if($MB.count -gt 1){
For($i=0;$i -lt $MB.count;$i++){
$DeviceModel=$MB[$i].DeviceModel
$DeviceFriendlyName=$MB[$i].DeviceFriendlyName
$DeviceUserAgent=$MB[$i].DeviceUserAgent
$LastSuccessSync=$MB[$i].LastSuccessSync
$Guid=$MB[$i].Guid
$name = $MB1.name
$PrimarySMTPaddress= $MB1.PrimarySMTPaddress
$Results += New-Object PSObject -Property @{
‘name’ = $name
‘PrimarySMTPaddress’ = $PrimarySMTPaddress
‘DeviceModel’ = $DeviceModel
‘DeviceFriendlyName’ = $DeviceFriendlyName
‘DeviceUserAgent’= $DeviceUserAgent
‘LastSyncTime’= $LastSuccessSync
‘Guid’=$Guid
}
}#end for
}#end if
Else{
$DeviceModel=$MB.DeviceModel
$DeviceFriendlyName=$MB.DeviceFriendlyName
$DeviceUserAgent=$MB.DeviceUserAgent
$LastSuccessSync=$MB.LastSuccessSync
$Guid=$MB.Guid
$name = $MB1.name
$PrimarySMTPaddress= $MB1.PrimarySMTPaddress
$Results += New-Object PSObject -Property @{
‘name’ = $name
‘PrimarySMTPaddress’ = $PrimarySMTPaddress
‘DeviceModel’ = $DeviceModel
‘DeviceFriendlyName’ = $DeviceFriendlyName
‘DeviceUserAgent’= $DeviceUserAgent
‘LastSyncTime’= $LastSuccessSync
‘Guid’=$Guid
}
}#End Else
}#endForEach
##Export results which lastysnctime pior 2017 then export to csv file
$Result = $Results | where-object {$_.LastSyncTime -lt “01/01/2017” -and $_.DeviceModel -ne $null}
$result |  export-csv .\OnPreDeviceSync.csv -notypeinformation

2.Office 365 Tenant

Prerequisite

  – Login to any powershell , Open powershell for login to Office 365

$credential = Get-Credential
$exchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri “https://outlook.office365.com/powershell-liveid/&#8221; -Credential $credential -Authentication “Basic” -AllowRedirection
Import-PSSession $exchangeSession
Script ​
 
#Create the list of tenant mailbox need retrieving devives connect
$Results = @()
Get-recipient -RecipientType usermailbox -resultsize unlimited | where {$_.HasActiveSyncDevicePartnership -eq $true -and $_.RecipientTypeDetails -notmatch “SharedMailbox” -and $_.HiddenFromAddressListsEnabled -eq $false } | Foreach{
$MB = Get-MobileDeviceStatistics -Mailbox $_.name
$MB1 = get-recipient $_.name
if($MB.guid.count -gt 1){
For($i=0;$i -lt $MB.guid.count;$i++){
$DeviceModel=$MB[$i].DeviceModel
$DeviceFriendlyName=$MB[$i].DeviceFriendlyName
$DeviceUserAgent=$MB[$i].DeviceUserAgent
$LastSuccessSync=$MB[$i].LastSuccessSync
$Guid=$MB[$i].Guid
$name = $MB1.name
$PrimarySMTPaddress= $MB1.PrimarySMTPaddress
$Results += New-Object PSObject -Property @{
‘name’ = $name
‘PrimarySMTPaddress’ = $PrimarySMTPaddress
‘DeviceModel’ = $DeviceModel
‘DeviceFriendlyName’ = $DeviceFriendlyName
‘DeviceUserAgent’= $DeviceUserAgent
‘LastSyncTime’= $LastSuccessSync
‘Guid’ = $Guid
}
}#end for
}#end if
Else{
$DeviceModel=$MB.DeviceModel
$DeviceFriendlyName=$MB.DeviceFriendlyName
$DeviceUserAgent=$MB.DeviceUserAgent
$LastSuccessSync=$MB.LastSuccessSync
$Guid=$MB.Guid
$name = $MB1.name
$PrimarySMTPaddress= $MB1.PrimarySMTPaddress
$Results += New-Object PSObject -Property @{
‘name’ = $name
‘PrimarySMTPaddress’ = $PrimarySMTPaddress
‘DeviceModel’ = $DeviceModel
‘DeviceFriendlyName’ = $DeviceFriendlyName
‘DeviceUserAgent’= $DeviceUserAgent
‘LastSyncTime’= $LastSuccessSync
‘Guid’=$Guid
}
}#End Else
}#endForEach
##Export results which lastysnctime pior 2017 then export to csv file
$Result = $Results | where-object {$_.LastSyncTime -lt “01/01/2017” -and $_.DeviceModel -ne $null}
$result |  export-csv .\Office365DeviceSync.csv

II. Delete long time no sync devices

Prerequisite

– After getting the report file type csv, we will import the csv and run the remove-activesyncdevice to remove devices no longer need.

– Please be noted that this step is just Removing and it depend on the list we import. If the list contain correctly devices, be certainly, it should be that way.

Script ​

For On-Premiese, please use this command:

import-csv OnPreDeviceSync.csv  | foreach-object { Remove-ActiveSyncDevice $_.Guid -Confirm:$false}

For Office 365, please use this command:

import-csv Office365DeviceSync.csv | foreach-object {Remove-MobileDevice $_.Guid -Confirm:$false}

Be sure to cleanup your Session after done with the removal, If you close the Windows PowerShell window without disconnecting the session, you could use up all the remote PowerShell sessions available to you

Remove-PSSession $Session

Sample Export result :

 

Capture

III. Some reference link related:

Connect to Exchange Online

https://docs.microsoft.com/en-us/office365/enterprise/powershell/connect-to-all-office-365-services-in-a-single-windows-powershell-window

Get-ActiveSyncDeviceStatistics

https://technet.microsoft.com/en-us/library/aa996908(v=exchg.141).aspx

Get-MobileDeviceStatstics

https://technet.microsoft.com/en-us/library/jj218659(v=exchg.160).aspx

Gia Đình, Người Vợ và những niềm vui

Bỏ bê blog cũng lâu, không phải không có tâm sự để viết mà là mình lười, chây lười – bệnh kinh niên từ nhỏ, hihi. Nay vô tình thấy tấm hình này trên fb (cre: Hanceo Stuido), chợt có suy nghĩ về gia đình nhỏ của mình.

Vợ mình là típ người tình cảm, lớn lên trong gia đình bình dân, trong một môi trường cũng bình thương, bạn bè xung quanh cũng bình thường và đi làm cũng trong một môi trường bình thường nốt. Vợ mình rất ít bạn, đôi lúc loay hoay chỉ thấy lui thủi ở nhà và về chơi với gia đình ngoại, còn lại là chơi với con nhỏ. Tóm lại là thuộc tiếp người tình cảm, ít giao tiếp, gia thế bình thường không có hoạt động ngoại khóa gì nổi bật, đời sống tinh thần cũng không đòi hỏi gì nhiều chỉ quanh quẩn chồng con gia đình nội ngoại.

Mình thì thuộc tiếp người ít nói, hay giấu cảm xúc, nói nhiều làm không bao nhiêu, công việc cũng trên mức trung bình một chút, mình có dăm ba người bạn thân từ nhỏ vẫn còn chơi đển giờ. Đôi khi tối rảnh thì giao lưu cafe, ăn uống với đám bạn. Tóm lại, mình là người nội tâm, ít nói và giao tiếp, không có nhiều bạn, gia cảnh bình thường. đời sống tinh thần của mình phong phú đôi chút, hay mộng mơ nhiều suy nghĩ. Mình cũng muốn người bạn chung nhà của mình cũng sẽ có những niềm vui, những ước mơ, một đời sống tinh thần phong phú.

Nhưng đời cũng không hẳn như mơ, mình muốn và thứ mình có được không phải lúc nào cũng giống nhau. Tối qua vợ tâm sự dạo này nhìn anh chán quá, thấy mặt anh lúc nào cũng nhăn nhó, ít nói chuyện với em vậy, anh hết thương em…Dạo này mình cũng áp lực nhiều thứ trong cuộc sống nên tâm trạng có đôi chút ảnh hưởng, lúc nào cũng suy nghĩ về những vấn đề đag nan giải mà vô tình nó hiện ra bên ngoài luôn khi nào không hay vậy mà vợ tinh ý phát hiện ra. Mình nói em có thể mang đến niềm vui cho anh không thay vì em trách móc anh. Hơn ai hết – mình rất muốn có một hành động ân cần vị tha của người vợ ngay lúc này nhưng không biết nói sao với nàng. Thôi thì một clip nhạc mà mình yêu thích và một tấm hình có hành động mà mình cần sẽ thay cho lời anh cần nói em nhé.

Mãi iu em.

coupleCute

 

 

 

 

Một ngày nhiều cảm xúc

Hôm nay đọc được nhiều thông tin, học được nhiều thứ mới, bỗng dưng mình xúc động vì ngoài kia vẫn còn những người thật tốt.

https://news.zing.vn/nguoi-mau-cuoi-vo-trong-tu-ra-trai-da-co-2-con-post475113.html

https://news.zing.vn/em-be-co-ro-o-muong-lat-duoc-cap-vo-chong-sai-gon-nhan-nuoi-post811245.html

Có khi nào chỉ cần qua một đêm mà con người ta có thể thay đổi cả số phận luôn không nhỉ ? Chẳng hạn như mua Vietlot qua một đêm thành tỉ phú $.$

Hihi

 

 

 

 

 

BỘN BỀ

Cuộc sống của mình lúc nào cũng bộn bề những suy nghĩ và âu lo, đầy những câu hỏi mà mình đôi khi không biết phải tìm đáp án như thế nào?

Có lẽ lâu rồi cũng thành quen, nó đã trở thành một thứ gì đó gắn với mình đến nỗi mình tưởng tượng một ngày nếu không có những suy nghĩ lo toan, có lẽ sẽ không phải là mình nữa và mình sẽ buồn lắm.

Mình lo cho những người thân liệu sống có tốt không? Đã bao lần mình hỏi những người thân quanh mình là ước mơ làm gì? Thật lạ là không ai mong ước như mình nhỉ, ước mơ mọi người thật giản đơn.

Người ta kiếm tiền nhiều để làm gì trong khi họ không cần? Chỉ là để những người thân của họ co thể thoái mái làm những gì họ thích, như vậy cũng thành ước mơ rồi.

Nhưng ước mơ như thế có mấy ai làm cho nó thành hiện thực được? Mình chỉ mong ở tuổi này, ba mẹ và những người thân nên sống thật an nhiên, không cần phải lo nghĩ làm sao để kiếm tiền đóng tiền học, làm sao để lo cơm nước hàng tháng, làm sao để có tiền uống thuốc…mình chỉ muốn mỗi ngày họ chỉ cần nghĩ hôm nay đi đâu cho vui, làm gì mà mình thích…chẵng lẽ cả đời chỉ sống vỏn vẹn trong đất nước mình và chỉ biết những đất nước và nền văn hóa khác qua truyền hình và sách báo hay sao? Tại sao lại bất công như vậy ? Không.

30 tuổi không giàu thì bao giờ giàu ? Ai đã từng nói như vậy ? Câu nói làm nhụt bao nhiêu ý chỉ nhỉ ? Nó thật vô lý đến nỗi trở thành câu cửa miệng của đại đa số người, nói cho vui cũng có nhưng mình tin điều đó không đúng, ít nhất là với mình.

Ý chí ư? Mình từng được nhiều người nói có chí, nhưng giấc mơ mãi vẫn không thực hiện được. Mình biết mình thiếu nhiều lắm, một trong những điểm là quyết tâm…

Hãy mạnh lên nữa nào.