Powershellで ローカルグループ名と所属するユーザー名を、カンマ区切りで出力する

前提:Powershell ver5.1以上であること。(Get-LocalGroupはver5.1以降のコマンドレット) Powershell ver2.0以上でも使えるように、一番下に追記しています!!!!


ローカルグループ名と所属するユーザー名を、カンマ区切りで出力する(ver5.1以上)


#### ローカルグループ名と所属するユーザー名を、カンマ区切りで出力するコード[#ここから#]


# ローカルグループ名を配列に格納
$group_name_list=(Get-LocalGroup).name


# 配列に格納したローカルグループ名を、1つ1つ取り出して処理するループ
foreach ($group_name in $group_name_list) {

 
    # 取り出したローカルグループ名に所属するユーザー名を、配列に格納
    $group_member_list=(Get-LocalGroupMember $group_name).name


        # 配列に格納したユーザー名を、1つ1つ取り出して処理するループ
        foreach ($group_member in $group_member_list) {

            # ローカルグループ名とユーザー名をカンマ区切りにして標準出力する
            echo "$group_name,$group_member"


        # 配列に格納したユーザー名を、1つ1つ取り出して処理するループ[終了]
        }


# 配列に格納したローカルグループ名を、1つ1つ取り出して処理するループ[終了]
}


#### ローカルグループ名と所属するユーザー名を、カンマ区切りで出力するコード [#ここまで#]





<# 結果出力の例 (EC2)

Administrators,EC2AMAZ-HELH38R\Administrator
Guests,EC2AMAZ-HELH38R\Guest
Guests,EC2AMAZ-HELH38R\Gutest
System Managed Accounts Group,EC2AMAZ-HELH38R\DefaultAccount
Users,EC2AMAZ-HELH38R\Gutest
Users,NT AUTHORITY\Authenticated Users
Users,NT AUTHORITY\INTERACTIVE

#>

参考:ワンライナー

(Get-LocalGroup).name |%{$group_name=$_;(Get-LocalGroupMember $group_name).name|%{echo "$group_name,$_"}}



Powershell ver2.0以上であれば使えるコード

# WMIオブジェクトのWin32_GroupUserクラスを呼び出す。その中からグループ名と所属ユーザー名を取り出して表にする(Select-Object)
$groupuser = Get-WmiObject Win32_GroupUser |Select-Object GroupComponent,PartComponent

# 取り出したグループ名と所属ユーザー名の表を1行ずつ処理するループ
foreach ($record in $groupuser) {

    # グループ名以外の情報を削る。(GroupComponent列の値をカンマ区切りにして、2つ目がグループ名になる。「Name=」を置換して消す。)
    $group=($record.GroupComponent.split(",")[1].replace("Name=",""))

    # ユーザー名以外の情報を削る。(PartComponent列の値をカンマ区切りにして、2つ目がユーザー名になる。「Name=」を置換して消す。)
    $member=($record.PartComponent.split(",")[1].replace("Name=",""))

    # CSV形式にして出力
    echo "$group,$member"

# 取り出したグループ名と所属ユーザー名の表を1行ずつ処理するループ[終了]
}


<# 結果

"Administrators","Administrator"
"Guests","Guest"
"Guests","Gutest"
"System Managed Accounts Group","DefaultAccount"
"Users","INTERACTIVE"
"Users","Authenticated Users"
"Users","Gutest"

#>

参考:ワンライナー

Get-WmiObject Win32_GroupUser |
Select-Object GroupComponent,PartComponent |
%{$group=($_.GroupComponent.split(",")[1].replace("Name=",""));$member=($_.PartComponent.split(",")[1].replace("Name=",""));echo "$group,$member"}

bitFlyer ビットコインを始めるなら安心・安全な取引所で

AWSBlackBelt読破への道

2018/01/29 現在 Black Belt 数 192★ これ以外にも追加がある。 その他までで:103 <= これを1日3つ読むと1月

  • コンピューティング

    • 20
  • ストレージ & コンテンツ配信

    • 11
  • データベース

    • 9
  • ネットワーキング

    • 3
  • 開発者用ツール

    • 11
  • 管理ツール

    • 8
  • セキュリティ & アイデンティ

    • 8
  • 分析

    • 7
  • AI

    • 1
  • IoT

    • 2
  • ゲーム開発

    • 2
  • モバイルサービス

    • 6
  • アプリケーションサービス

    • 8
  • エンタープライズアプリケーション

    • 4
  • コンタクトセンター

    • 1
  • その他

    • 2
  • ソリューション別資料

    • 72
  • 業種別資料

    • 3
  • その他の資料

    • 14



実績

ファイルリスト作成し、tarで圧縮するシェルスクリプト



やりたかったこと

  1. 指定フォルダ(hoge)のファイルリスト(パーミッション、タイムスタンプ、サイズ、フルパス)を作成する(~filelist.log)
    コマンド:find /hoge_parent/hoge -ls
  2. 実行ログに処理開始時間を記録する(~execution.log)
  3. 指定フォルダ(hoge)をtar形式に圧縮する(エラーの場合は標準出力に渡す)
    コマンド:tar cfv /hoge.tar -C /hoge_parent hoge
    解説  :/hoge_parent に移動し(-C)、hogeフォルダを圧縮する。圧縮して/hoge.tarを作成する(cfv)
  4. 実行ログに処理修了時間を記録する(~execution.log)



#!/bin/bash

<< THIS_IS_COMMENT_LINE


This script makes a "tar" archive and outputs list of the archived files
and outputs a log to ensure results.

available: HP-UX / RHEL xx

caution!! user must be "root".

usage:
$1 is folder to archive
$2 is name of "tar" archive
$3 is destination to make "tar" archive
$4 is name of filelists and log

sample:
sh commontarls.sh \
/Users/t-yamamoto/Documents/_Ruby/ \
_Ruby.tar \
/Users/t-yamamoto/Documents/bkyama \
_Ruby


THIS_IS_COMMENT_LINE




# define variable
folder_to_archive="$1"
name_of_tar="$2"
destiation_of_tar="$3"
name_of_filelists_log="$4"


# to output fullname file list
find ${folder_to_archive} -ls > ${destiation_of_tar}/${name_of_filelists_log}_filelist.log




# to output start date
echo "start ${name_of_tar}" >> ${destiation_of_tar}/${name_of_filelists_log}_execution.log
date >> ${destiation_of_tar}/${name_of_filelists_log}_execution.log




# to make "tar" archive
echo command: \
tar cfv ${destiation_of_tar}/${name_of_tar} \
-C `dirname ${folder_to_archive}` `basename ${folder_to_archive}` \
>> ${destiation_of_tar}/${name_of_filelists_log}_execution.log

tar cfv ${destiation_of_tar}/${name_of_tar} \
-C `dirname ${folder_to_archive}` `basename ${folder_to_archive}` \
>> ${destiation_of_tar}/${name_of_filelists_log}_execution.log 2>&1

case `uname` in
  "Linux")
       exitcode=$?;;
  "HP-UX")
       exitcode=$status;;
esac

[ ${exitcode} -eq 0 ] && echo "status:${exitcode} ok!!" || \
echo "status:${exitcode} archive failed!!!!!!!!"




# to output end date
echo "end ${name_of_tar}" >> ${destiation_of_tar}/${name_of_filelists_log}_execution.log
date >> ${destiation_of_tar}/${name_of_filelists_log}_execution.log



exit 0
  • 参考にしたサイト

ls -lコマンドの結果をサブディレクトリ含めてフルパスで列挙したい - Qiita

シェルスクリプトで親ディレクトリのパスを取得したい – hrendoh's tech memo

tesiri.hateblo.jp

qiita.com

Bashでcase文を利用する – REONTOSANTA





終わり

2017/12/10(日) -シェル変数


# Linux環境変数ファイルが読み込まれる順番

1. /etc/profile
このファイルに全ユーザ共通の環境変数設定を記載しています。
読み込みは、ユーザーがログインした時(ログインシェル)です。
(ターミナルログイン、bash --login、ssh、su - コマンドなど)


2. ~/.bash_profile 
各ユーザのホームディレクトリ(~/)にあります。
このファイルにユーザ毎の環境変数設定を記載しています。
読み込みは、ユーザーがログインした時(ログインシェル)です。
(ターミナルログイン、bash --login、ssh、su - コマンドなど)
1. の次に読み込み、
1. で設定した環境変数と同名の環境変数がある場合は上書きします。


3. ~/.bashrc
各ユーザのホームディレクトリ(~/)にあります。
読み込みは、インタラクティブシェルを起動する時です。
(bash、su コマンドなど)
また、基本的には 2. の ~/.bash_profile に、 3. の ~/.bashrc を呼ぶ記載があります。
結果として、この ~/.bashrc に定義しておくことで、
ログインシェルでもインタラクティブシェルでも同じ環境変数を定義することが可能です。


4. /etc/bashrc
このファイルに全ユーザ共通の関数とエイリアス環境変数設定を記載しています。
ここでデフォルトのプロンプトを決める「PS1」の設定などをしています。
(bash、su コマンドなど)
また、基本的には 3. の ~/.bashrc に、 4. の /etc/bashrc を呼ぶ記載があります。
結果として、この /etc/bashrc に定義しておくことでも、3. ~/.bashrc と同様、
ログインシェルでもインタラクティブシェルでも同じ環境変数を定義することが可能です。


1. 2. で環境変数を定義、
3. 4. で関数やプロンプト表示を定義するのが本来は一般的な使い方です。

 

 

 

 


# シェル変数と環境変数の違い

シェル変数・・・・現在のシェル(同一プロセス)内でのみ有効な変数(exportしない変数)
環境変数・・・・・現在のシェルから呼び出すシェル(子プロセス)にも引き継がれる変数(exportする変数)

test.sh での実行例。
# testval.sh の中身
echo $testval

# シェル変数の例

testval="test"
echo $testval

=> test

sh test.sh

=> 何も出力ない

# 環境変数の例:
testval="test"
export testval
echo $testval

=> test

sh test.sh

=> test

 

 

 

 


# .(source)コマンドと、shコマンド(またはフルパス実行)の違い

どちらのコマンドも、引数に指定されたファイルを実行しますが、
違いは下記です。

shコマンド(またはフルパス実行)・・・・別シェル(別プロセス)で起動
.(source)コマンド・・・・・・・・・・現在のシェル(同一プロセス)で起動


# shコマンド(またはフルパス実行)

testval2="test2"
echo $testval2

=> test2

sh test.sh

=> 何も出力ない


# .(source)コマンド

testval2="test2"
echo $testval2

=> test2

. test.sh

=> test2

 

 

 


上記を全て踏まえると現在のシェル上に環境変数を定義し、
shコマンドで呼び出すシェルからも参照できるようにするには、
~/.bashrc または/etc/bashrcに、
下記のように記載します。

# 案1
test=testprog
export test

# 案2
. ~/envsetting

# ~/envsettingの中身
test=testprog
export test


# おまけ:シェバン(#!/bin/bash)の意味
=> インタプリタの指定を行います。

Ruby--スレッド処理

# スレッド処理
threads=[]
txtfilelist = %w{yamazon.txt yamazon2.txt}
for txtfile in txtfilelist
  threads << Thread.new(txtfile) do |txt|
    File.open(txt, "a") do |file|
      file.puts "hello"
    end
  end
end

# 待ち合わせ
threads.each do |each_thread|
  each_thread.join
end

Ruby--ファイル読み書き、ファイバー

# 書き込み
File.open("yamazon.txt", "w") {|file| file.puts "hello";file.puts "a"}

# 書き込み 追記
File.open("yamazon.txt", "a") {|file| file.puts "h i j k";file.puts "a hello"}

# ファイルオープン 改行区切りで読み込み表示
File.open("./yamazon.txt") do |file|
file.each_line("\n") {|line| p line}
end

# 上と同じ
File.open("yamazon.txt","r") {|file| file.each_line {|line| p line}}
# 正確には
File.open("yamazon.txt","r") {|file| file.each_line("\n") {|line| p line}}

# 上と同じ
File.foreach("./yamazon.txt") {|line| p line}
# 正確には
File.foreach("./yamazon.txt","\n") {|line| p line}


# 1つの文字列として読み込み
str= IO.read("yamazon.txt")


# 出てくる単語を数えるFiber
words = Fiber.new do
  File.foreach("./yamazon.txt") do |line|
    line.scan(/\w+/) do |word|
      Fiber.yield word.downcase
    end
  end
end

counts = Hash.new(0)
while word = words.resume
  counts[word] += 1
end
counts

# => {"hello"=>2, "a"=>2, "h"=>1, "i"=>1, "j"=>1, "k"=>1}

McAfee VirusScan Enterprise 8.xのウイルススキャンで、ネットワークドライブ接続先をスキャンするためのメモ。

  • エージェントの入っているWindows7端末から、ネットワークドライブマウントしているXP端末のローカルドライブをスキャンする必要があり、調べた。

結論

  • McAfeeが行うスキャンはユーザー単位に行う

    • エージェントを入れている7端末でローカルディスク(CやD)をスキャンしている時は、ログインしているユーザー(のディスクI/O、ファイルアクセス権)でスキャンする
    • ネットワークドライブ接続(net use)先のディスク(XP端末)をスキャンする時は、接続認証したユーザーの(のディスクI/O、ファイルアクセス権)でスキャンする
  • 上記により、XP端末をスキャンするには、XP端末で利用するユーザーを固定して(仮:userA)、Windows7でネットワークドライブマウントする時は、固定したユーザー(userA)で接続認証しスキャンする。



詳細は下記


そもそも、ローカルドライブでのスキャンはどのユーザーで実行しているの?


  • 答え:ログインユーザー。ログオフ時はシステムユーザー(サービス起動ユーザー)。
    • 要はログインユーザーでのディスクI/Oをフックしてスキャンしているということ。


手動スキャン タスクとスケジュールされたスキャン タスクの間にはどのような認証が使用されますか。  
  
VSE では手動タスクでもスケジュールされたタスクでも実行できます。  
このようなタスクが明示的に特定の視覚情報を提供することなく設定されている場合、  
VSE は次のアカウントを使用します。  
  
・NT 権限 / システム カウント(スケジュールされたタスクで、ログインしているユーザーがいない場合)  
・ログオン ユーザー アカウント(手動タスクの場合)  



次にネットワークドライブのスキャンはどのユーザーで実行しているの?

  • 答え:ネットワーク接続(net useなど)の認証に用いたユーザー。ログオフ時にもシステムユーザー(サービス起動ユーザー)が実行してくれるが、ネットワーク接続は、ネットワーク接続を実施したユーザーのログイン時しか有効にならないため、できない。


Windows XP
Windows 2000

Available depending on security assignments relating to the credentials used on the destination computer
(which must also be Windows 2000 or XP).
The rights required equal Microsoft  delegate impersonation level.
How this is achieved depends on Active Directory (AD) / Domain membership, mix of operating systems and Service Pack levels.
Refer to your Microsoft documentation for instructions. Also see http://technet.microsoft.com/en-us/library/cc961980.aspx.


McShield サービスはシステム サービスとして実行されています。
Intel Security が、これを変更しないように推奨する理由は何ですか。
技術的には変更できますが、Intel Security では変更しないようお勧めしています。
McShield サービスは、デフォルトでは、システム サービスとして実行されます。
これは、どのローカル リソースにもアクセスでき、リモート スキャニングを実行できるようにするためです。
ネットワーク ドライブ スキャニングが有効になっている場合、このプロセスはリクエスタになりすまします。





end