Active Directory

PageLastUpdate:2010-10-14/total: - /today: - /yesterday: -

Windows Server 2008からはドメイン内で複数のパスワードポリシーを設定できる

2010/04/30
http://technet.microsoft.com/ja-jp/library/cc770394(WS.10).aspx
これしらなかったのでメモ。

グループ ポリシー オブジェクトにクリスタル レポートの64bit向けmsiパッケージを追加しようとするとエラー

2009/12/01
ドメインコントローラー:Windows Server 2003 R2(32bit)
対象クライアント:Windows 7 Professonal 64bit Japanese
使用したパッケージ:CRRedist2005_X64.msi、CRRedist2005_X64_JP.msi

Windows 7の64bit版導入に伴ってクリスタル レポートをGPOで配布しようとしたところ
追加操作でエラーが発生しました。パッケージから展開情報を抽出できませんでした。 
パッケージが正しいことを確認するためにパッケージの確認を実行してください。 
GPO を作成できません。
と怒られる。
KB324886が出ているけれど、これはWindows2000向けで特に64bitとか関係なさそう。Windows2003で関連する情報を見つけることはできなかった。

専用のGPOを作成したので32bitと64bitの混在とかそういう問題ではないっぽい。
もしかしてサーバーが32bitOSだと、64bit用のパッケージは展開できないのだろうか。
とりあえず1台だけだったので手動で設定したが、今後台数が増えるとめんどくさい。
未解決なのでわかる方がいましたら教えてください。

 → 2010/10/13解決
   2008R2、64bitのサーバーをメンバサーバーとして追加。グループポリシー管理エディタを機能として追加。
   そのサーバーからGPOを設定することで回避できました。ドメコンではなくメンバサーバーでよいので助かった。
   ただ誰でも使える方法ではないので本当は解決とは言い難いですね。


レジストリの有無を確認した上で、存在すればレジストリを削除

2009/11/10
On Error Resume Next
strRegValue = wss.RegRead("レジストリのパス")
On Error Goto 0
If strRegValue <> "" Then
    wss.RegDelete("レジストリのパス")
End If

Windows 2000 では「gpupdate /force」ではなく「secedit /refreshpolicy」

secedit /refreshpolicy

XPクライアントに特定のユーザー/グループのみログインを許可する

2009/04/02
1.[コンピュータの管理]-[ローカル ユーザーとグループ]-[グループ]を開く
2.Usersから下記の3グループを削除
Domain Users
NT AUTHORITY\Authenticated Users (S-1-5-11)
NT AUTHORITY\INTERACTIVE (S-1-5-4)
3.ログインさせたいユーザー/グループを追加
いちおうこの手順でできた。[Domain Users]だけではダメ。
[NT AUTHORITY\Authenticated Users (S-1-5-11)]を抜いてもダメ。
[NT AUTHORITY\INTERACTIVE (S-1-5-4)]まで抜いたら期待通りに動作しました。
ただし、まだ様々な動作で不具合が出るかどうか未検証。

WSUSで承認された更新プログラムをすぐにクライアントに反映させる

2009/04/01
基本は更新プログラムの承認時に[更新の承認]→[期日]で日時指定をしておくことですが、コマンドラインからやりたい場合は
wuauclt.exe /resetauthorization /detectnow
でできる。

DHCPでルーティングを設定

2009/02/17

xxx.yyy.0.0のネットワークでデフォルトゲートウェイはxxx.yyy.0.250だとする。
xxx.zzz.0.0への接続だけxxx.yyy.0.251のゲートウェイ(ルーター)に振り分けたい。

1.まずDHCPではなくコマンドラインで設定してテストして見る
route add xxx.yyy.0.0 mask 255.255.0.0 xxx.yyy.0.251
2.設定できたか確認
route print
3.経路情報を確認
tracert xxx.yyy.0.0
4.テスト用の接続情報を削除
route delete xxx.yyy.0.0
5.DHCPにてスコープオプションに「249 クラスレス静的ルート」にチェックを入れて下記の通り設定。
  • 宛先:xxx.zzz.0.0
  • マスク:255.255.0.0
  • ルーター:xxx.yyy.0.251

6.経路情報を確認
tracert xxx.yyy.0.0

とりあえず俺がわかっていなかったので超簡略化して書いておく。
aaa.bbb.0.0で0を指定した後ろ二つは1-255の範囲を指すことになる。サブネットマスクは255.255.0.0。
aaa.bbb.ccc.0に対してならサブネットマスクは255.255.255.0のようにすればよい。
この理解だけだと間違いなので、この記事とか読んで理解してから設定しないと痛い目みるかも。
http://www.atmarkit.co.jp/fnetwork/netcom/route/route.html

Domain Computersのローカル管理者パスワードを任意の値に変更する

2009/02/04

スタートアップ スクリプトとタスク スケジューラーを併用することで実現しています。

ここに辿り着くまでの経緯
  • Administratorは使用不可にしてもセーフモードで起動すると使えてしまう。対策はパスワードを困難なものにするしかない。できれば定期的に変更する。
  • Windowsの基本機能のみで実装する。
  • 100台以上のDomain Computersすべてをループしてチェックすると、電源の入っていないPCなどの応答待ちでスクリプトの実行時間が長すぎる。
  • スタートアップ スクリプトを使用して、起動したコンピュータのみチェックすることで負荷を軽減する。
  • コンピューターから見えないスクリプトは実行できないが、スクリプトにパスワードを書くと閲覧される危険性がある。
  • パスワードを変更するたびにexeを差し替えたりするのは望ましくない。exeから逆コンパイルされる可能性も高い。
  • タスク スケジューラーであれば、コンピューターから見えないスクリプトを実行可能。
  • タスク スケジューラーはウィザードでは1日単位しか設定できないが、設定した後にプロパティで「9:00から17:00まで1時間ごとに繰り返し実行」のような指定ができる(不親切。最初にタスク登録しようとしたときは「1日単位しかできないのかよ!」と思って諦めていた。)

1.Domain Computersのみ閲覧可能な共有フォルダを作成

 \\MyServer\LocalAdminCheck

2.スタートップスクリプトで起動時にローカル管理者パスワードの変更チェック用ファイルを生成

Set net = CreateObject("WScript.Network")
Set fso = CreateObject("Scripting.FileSystemObject")
 
donePath = "\\MyServer\LocalAdminCheck\Done\" & net.ComputerName & ".txt"
undonePath = "\\MyServer\LocalAdminCheck\Undone\" & net.ComputerName & ".txt"
 
IF fso.FileExists(donePath) = False Then
    set fp = fso.CreateTextFile(undonePath,True) 
    fp.Close
End If
 

3.タスクスケジューラーが1時間に1回LocalAdminChange.vbsを実行

このスクリプトは共有されていないフォルダに置きます。
Set fso = CreateObject("Scripting.FileSystemObject")
 
doneFolder = "\\MyServer\LocalAdminCheck\Done"
undoneFolder = "\\MyServer\LocalAdminCheck\Undone"
 
For Each file In fso.GetFolder(undoneFolder).Files
    targetName = fso.GetBaseName(file.Path)
    donePath = doneFolder & "\" & targetName & ".txt"
    undonePath = undoneFolder & "\" & targetName & ".txt"
 
    On Error Resume Next
    Set objUser = GetObject("WinNT://" & targetName & "/Administrator, user")
    Select Case Err
        Case 0
            objUser.SetPassword "ここにパスワードを記述"
            objUser.SetInfo
            set fp = fso.CreateTextFile(donePath,True)
            'パスワードが設定できたら、このスクリプトの更新日をDoneフォルダのコンピュータ名.txtに出力
            fp.Writeline fso.GetFile(Wscript.ScriptFullName).DateLastModified
            fp.Close
 
            'Undoneフォルダから削除
            file.Delete
        Case Else
            '設定できなかったら、エラーコードをUndoneフォルダのコンピュータ名.txtに出力
            set fp = fso.CreateTextFile(undonePath,True)
            fp.writeline Err
            fp.Close
    End Select
Next

備考

まあここまでできれば、パスワードを定期的に変更しつつそれをログに記録していくとかどうにでも組めますね。
1台づつパスワード変えたければ日時とコンピュータ名でハッシュ化しちゃうとかいろいろ。
懸念として意図しないコンピュータ名をフォルダに送り込まれる可能性がありますが、ローカル管理者のパスワードを推測不能「こちらに既知で相手に未知」なものに変更されてもそれほどダメージはないのでよしとしておきます。

Acrobat Reader 8が「内部エラー 2753。Updater.api_NON_OPT」でアンインストールできない

2009/01/09 検索後:アップデート
http://www.adobeforums.com/webx/.3c05d1a2
グループポリシーでAcrobat Reader 9を配布したら、なぜかこける。
ログを確認したらでAcrobat Reader 8のアンインストールでこけている。
手作業でアンインストールしてみると「内部エラー 2753。Updater.api_NON_OPT」。
エラーメッセージで検索すると、パッチが当たっているとアンインストールできないらしい。馬鹿だ。
Adobeのサイトにはめんどくさい方法が書いてあったけど、下記レジストリを削っちゃえばOK。
REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Features\68AB67CA7DA71401B7448A0100000030
REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\68AB67CA7DA71401B7448A0100000030
 

Excelファイルの個人情報を削除してもプリンタのパスが残る

2008/06/17
Excel 2002を元に記述していますので、2003は同じだと
とりあえず下記を参考にすると、ファイルのプロパティ情報を消して、下記設定をすればいいように読めます。
http://office.microsoft.com/ja-jp/excel/HP010503321041.aspx
[ツール]→[オプション]→[セキュリティ] タブ→[保存時にファイルのプロパティから個人情報を削除する] チェック ボックスをオンに。
ところがこれだけだと不完全で、メモ帳で開いてみるとわかりますが、プリンタのパスが残っています。
ドメイン環境で使っていると、どこの会社から出たものかモロバレですねw
会社名が残るとまずい場合は、ローカルプリンタで印刷してから上書き保存しましょう。

Bullzip PDF Printerのサイレントインストール

2008/05/30
フリーのPDF生成プリンタドライバ。商用利用も無料。
セットアップファイルはexeのみ。msiは提供されていないので、サイレントインストールをするには少し準備が必要。
1.http://www.bullzip.com/products/pdf/info.php#downloadから本t内をダウンロード。解凍して、適切な配布用フォルダに置く。
2.http://www.bullzip.com/download/gsl/gslite.exeからgslite.exeをダウンロード。本体と同じ配布用フォルダに置く。
3.何らかの方法で
BullzipPDFPrinter_5_0_0_609.exe /VERYSILENT /NORESTART
をクライアントに実行させます。管理者権限が必要なのでスタートアップスクリプトがよいと思いますが、実行するたびにプリンタが増えていくので注意。

関連記事

2008/12/17追記

今日気づいたけど最新版は商用利用は10ユーザーに制限されているっぽい。
過去のバージョンまで遡及適用かどうかこれから調査。

VBScriptでフォルダのアクセス権におけるユーザーの継承元を調べる

「Word/Excel/PowerPoint 2007 ファイル形式用 Microsoft Office 互換機能パック」をWSUSで配布する

2008/05/16
互換機能パックは下記からダウンロードできますが、配布形態はexeのみでmsiがありません。
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=941b3470-3ae9-4aee-8f43-c6bb74cd1466
コマンドラインで次のように入力しmsiファイルと関連データを取り出します。
FileFormatConverters.exe /extract:c:\temp\
→[マイクロソフト ソフトウェア ライセンス条項に同意するにはここをクリックしてください]にチェックを入れて[次へ]→「ファイルが正常に解凍されました。」
/extract:で指定したパスにmsiファイルと関連ファイルが解凍されるので、配布用のフォルダにすべてコピーします。
あとは普通にグループポリシーで配布設定をすればOKです。

ちなみにサービスパックが出ているので、WSUSでサービスパックの配布をするのも忘れないようにしましょう。

コンピュータ名の一覧を元にローカルAdministratorのパスワードを変更するスクリプト

2008/05/14
はてなの質問に回答。
すべての端末の電源が入っているとは限らないので、ログを取れるようにした。
失敗しているものだけ再度リストにして流す必要あり。
パスワードを直接記述している以上、このスクリプトを見られることは深刻な脆弱性に繋がるので注意。
'【書換必須】コンピュータを列挙したファイルパス。コンピュータごとに改行。
strListPath = "C:\Documents and Settings\Administrator\デスクトップ\List.txt"
'【書換必須】結果を出力するログファイルパス。
strLogPath = "C:\Documents and Settings\Administrator\デスクトップ\Log.txt"
'【書換必須】指定したい管理者パスワード
strPWD  = "czBnkbe+47i"
 
Set fso = CreateObject( "Scripting.FileSystemObject" )
Set ts = fso.OpenTextFile( strListPath, 1 )
    lines = Split( ts.ReadAll, vbCrLf )
    ts.Close
 
set tsLog = fso.CreateTextFile(strLogPath,True)
 
On Error Resume Next
For i = 0 to Ubound(lines) - 1
    strComputer = lines(i)
    Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
    objUser.SetPassword strPWD
    objUser.SetInfo
 
    tsLog.WriteLine(strComputer & "," & Err.Number & ":" & Err.Description)
    Err.Clear
Next
 
tsLog.Close
 
Msgbox "Finish!"


ローカル管理者としてドメインユーザーを追加/削除する

2008/04/18
遠隔地のPCにリモートで繋がらない。プリンタドライバをインストールしたいだけなんだけど。
とりあえず緊急回避としてユーザーに自分でインストールしてもらうことに。
Domain Admin権限を与えるのはイヤだったので、スクリプトで一時的にローカル管理者にすることに。
最初LDAPでユーザーオブジェクト取得して突っ込もうとするとコケる。下の関数がその名残ですw
調べてみたら、WinNTプロバイダを使わなくちゃいけないんですってさ。
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/oct04/hey1008.mspx
strComputer = "hoge"
strUser = "moge"
 
Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
Set objUser  = GetObject("WinNT://example.co.jp/" & strUser)
objGroup.Add(objUser.AdsPath)
'objGroup.Remove(objUser.AdsPath)

MsgBox "終了しました"
 

LDAPとログインIDを指定してユーザーオブジェクトを取得する関数

2008/04/18

呼び出し方

strLDAP = "LDAP://DC=example,DC=co,DC=jp"
strName = "username"
Set objUser = GetUserObject(strLDAP,strName)
MsgBox objUser.Name

関数本体

Function GetUserObject (strLDAP,strName)
 
    Const ADS_SCOPE_SUBTREE = 2
 
    Set objConnection = CreateObject("ADODB.Connection")
        objConnection.Provider = "ADsDSOObject"
        objConnection.Open "Active Directory Provider"
 
    Set objCommand = CreateObject("ADODB.Command")
    Set objCommand.ActiveConnection = objConnection
        objCommand.Properties("Page Size") = 1000
        objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
        'samAccountNameは一意のはず(たぶん。調査した範囲では間違いなく。)
        objCommand.CommandText = "SELECT distinguishedName FROM '" & strLDAP _
                               & "' WHERE objectCategory='user' AND samAccountName='" & strName & "'"
 
    Set objRecordSet = objCommand.Execute
 
    IF objRecordSet.RecordCount = 1 Then
        objRecordSet.MoveFirst
        strDN = objRecordSet.Fields("distinguishedName").Value
        Set objUser = GetObject("LDAP://" & strDN)
        Set GetUserObject = objUser
    Else
        Set GetUserObject = Nothing
    End If
 
End Function

ファイルサーバーリソースマネージャ用にSMTPサーバーを立てる

2008/04/17
ファイルサーバーリソースマネージャでメール通知を出させようと思ったら、smtpサーバーの設定がほんとにアドレスしか設定できない。
匿名アクセスのみって、大丈夫なのかよと思いつつ、やむなくsmtpサービスを有効にすることに。
なにかしらドメイン内だけに限定するような設定あるだろ、たぶん。
ということで↓
Windows Server 2003 の IIS SMTP 仮想サーバーでメールの中継を防ぐ方法

1.[プログラムの追加と削除]→[Windows コンポーネントの追加と削除]→[アプリケーション サーバー]→[詳細]→[インターネット インフォメーション サービス(IIS)]→[詳細]→[SMTPService]をチェック。
結構深い。CDは要求されたけど再起動は不要(これ結構重要)。
2.IISマネージャに[既定の SMTP 仮想サーバー]が追加されるので
[既定の SMTP 仮想サーバー]を右クリック→[プロパティ]→[アクセス]タブで以下の2点を設定
  • [接続]→[以下のリストに含まれるコンピュータのみ]をチェックして、127.0.0.1とサーバーのアドレスを追加
  • [中継]→[以下のリストに含まれるコンピュータのみ]をチェックして、127.0.0.1とサーバーのアドレスを追加


WSHで配列の比較にScripting.Dictionaryを使って高速化

2008/04/05 検索後:リニアサーチ、Linear Search、ハッシュテーブル
Active Directoryつか、WSHだけど、WSHをADの管理にしか使ってないからとりあえずココで。
二つの配列の内容を比較するのに馬鹿ループ(リニアサーチ)とDictionaryでどのくらい速度が違うのかを計測。
データ数 1000×1000 65536×65536
Dictionaly 0.98秒 1.97秒
リニアサーチ 113.16秒 終わらないから強制終了w

サンプルソース

Set fso = CreateObject( "Scripting.FileSystemObject" )
 
'lines1にテキストファイルからリスト1を読み込み
Set ts = fso.OpenTextFile( "List1.txt", 1 )
lines1 = Split( ts.ReadAll, vbCrLf )
ts.Close
 
'lines2にテキストファイルからリスト2を読み込み
Set ts = fso.OpenTextFile( "List2.txt", 1 )
lines2 = Split( ts.ReadAll, vbCrLf )
ts.Close
 
'■Dictonaryを使用した存在確認
start1 = timer 
Set dic = CreateObject( "Scripting.Dictionary" )
For i = 0 to Ubound(lines) - 1
    dic.Add lines(i) , 0
Next
For i = 0 to Ubound(lines2) - 1
    If dic.Exists(lines2(i)) = True Then
    End If
Next
elapsed 1= timer1 - start
'■リニアサーチを使用した存在確認
start2 = timer
For i = 0 to Ubound(lines) - 1
    For j = 0 to Ubound(lines2) - 1
        IF lines(i)=lines2(j) Then Exit For
    Next
Next
elapsed2 = timer - start2
 
'■結果表示
MsgBox "Dictionaly:" & elapsed1 & vbcrlf & "リニアサーチ:" & elapsed2

テキストファイルからユーザーの一覧を読み込んで「ユーザーは次回ログオン時にパスワード変更が必要」に設定

2008/04/05 検索語:スクリプト、WSH
とりあえず組んだ。エラー処理とかしてないけど。
strPath = "C:\Documents and Settings\Administrator\デスクトップ\Users.txt"
strLDAP = "LDAP://dc=example,dc=co,dc=jp"
 
Const ADS_SCOPE_SUBTREE = 2
 
Set fso = CreateObject( "Scripting.FileSystemObject" )
Set ts = fso.OpenTextFile( strPath, 1 )
    lines = Split( ts.ReadAll, vbCrLf )
    ts.Close
 
Set dicUsers = CreateObject( "Scripting.Dictionary" )
For i = 0 to Ubound(lines) - 1
    dicUsers.Add lines(i) , 0
Next
 
Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
 
Set objCommand =   CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
    objCommand.CommandText = "SELECT distinguishedName,CN FROM '" & strLDAP & "' WHERE objectCategory='user'"
 
Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst
 
Do Until objRecordSet.EOF
    strDN = objRecordSet.Fields("distinguishedName").Value
    IF dicUsers.Exists(objRecordSet.Fields("CN").Value) Then
        Set objUser = GetObject("LDAP://" & strDN)
        objUser.pwdLastSet = 0
        objUser.SetInfo
    End If
    objRecordSet.MoveNext
Loop

参考アドレス


グループポリシーオブジェクトエディタで設定した項目がレポートで正しい名称で表示されない

2008/04/02
グループポリシー管理コンソールのレポートで、[管理用テンプレート]-[レジストリの追加設定]という項目が表示され
いくつかの設定の表示名が見つかりません。グループ ポリシーの管理が使用している .ADM ファイルを更新すると、この問題を解決できる場合があります。
Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\ListBox_Support_ZoneMapKey 1
Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMapKey\...
と表示されている。
調べてみると
[コンピュータの構成]-[管理用テンプレート]-[Windows コンポーネント]-[Internet Explorer]-[インターネットコントロールパネル]-[セキュリティページ]
内の項目
[サイトとゾーンの割り当て一覧]
に設定した内容だった。

コンピュータのSIDの取得

2008/01/29
以前から調査していたコンピュータのSIDの取得方法がやっとわかった。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=34260&forum=6&start=0

HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Aliases\Members\
HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account\Aliases\Members\
管理者アカウントでも見ることはできなくて、システムアカウントでアクセスする必要がある。
問題はこの後で、これを読み出すのはいいとして、ファイルとして保存したとすると、漏洩したときにどのぐらいセキュリティにダメージがあるのかがわからない。暗号化フォルダなどはこれで解析できそうだけど。
普通のユーザーのSIDはレジストリエディタで丸見えだけど。どうなのかな。
2008/01/30 追記:とりあえず暗号化フォルダの復号もできないし、SIDは公開されるのが前提のようなのでちょっと安心。

SIDについての詳細な記事があったのでメモ

2008/01/29 検索語:セキュリティID
http://codezine.jp/a/article/aid/434.aspx

Windows 2000 と Windows XP のコンピュータ アカウントのリセット

2008/01/29
ときどきPCがドメインから追い出されることがあるのはたぶんこのせいか。
resetは知らなかったのでとりあえずメモ。
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B216393

ローカル管理者のパスワードを一括で更新するスクリプト

ドメインに所属するクライアントのローカル管理者のパスワードを一括で更新します。
ドメインの管理者権限を持つユーザーでログインして実行します。
実際にはクライアントが起動していないと変更されませんので、スタートアップスクリプトを併用することも考えたほうがよいかも。
でもパスワード文字列を読み取れるファイルに記録してしまうとまずいので悩んでいるところです。
データベースを使って変更の成否を記録しながら一定間隔で個別に流すかなぁ。
なにかいい方法を知っている人がいれば教えてください。

strLogPath="Log.txt"
strPWD="ExamplePassword"
 
Const ADS_SCOPE_SUBTREE = 2
 
'ADODBコネクションの作成
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
'ADODBコマンドでドメインに所属するコンピュータを問い合わせ
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = "SELECT Name,OperatingSystem FROM 'LDAP://DC=example,DC=co,DC=jp' WHERE objectClass='computer'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
 
'各クライアントの成否を記録するログファイルを生成
set fso = CreateObject("Scripting.FileSystemObject")
set fp = fso.CreateTextFile(strLogPath,True)
 
On Error Resume Next
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    strComputer = objRecordSet.Fields("Name").Value
    'サーバーの管理者パスワードを変えてしまわないようにOSで限定しています。
    'これはまあOU使ってもいいですし、絞り方はいろいろ。
    If objRecordSet.Fields("OperatingSystem").Value="Windows XP Professional" Then
        Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
        objUser.SetPassword strPWD
        objUser.SetInfo
        fp.WriteLine(strComputer & "," & Err.Number & ":" & Err.Description)
    End If
 
    objRecordSet.MoveNext
Loop
 
fp.Close
Msgbox "Ok"

SQLServer200のサイレントインストール

setup.exeでサイレントインストール

2007/11/08 検索語:インストールシールド Install Shield 応答ファイル
http://www33.ocn.ne.jp/~loreley/FSB/installs01.html
Setup.exe -a -r -f1c:\testSet.iss
で応答ファイルを作成して
Setup.exe -s -f1c:\testSet.iss
でサイレンとインストール、という感じ。
関連URL:http://www.microsoft.com/japan/technet/desktopdeployment/bdd/2007/AppMgmt_6.mspx

Windows Server 2003 R2 でファイル サーバー リソース マネージャを有効にする

2007/10/26
ファイルサーバーでクォータを使おうと思ったら、2003R2からあるはずのFSRMが見当たらず。
ああでもないこうでもないといじりまわしても見つけられず、検索をかけたら下記サイトが
http://www.microsoft.com/japan/technet/itsolutions/msit/valuecard/msfsrmvc.mspx


ファイル サーバー リソース マネージャを有効にします。
って・・・俺はどうやって有効にするか知りたいんだよ!

結局TeckNetで
「ファイル サーバー リソース マネージャのコンポーネントを使用する」
http://www.microsoft.com/japan/technet/windowsserver/2008/library/0cd724af-b8c7-4fe8-bcd7-0889f35b5ec8.mspx
を見つけました。

ああ、[プログラム の追加と削除] の [管理ツール]ね。
そういえばグレーになってたけど中を開けて見なかった私が悪いのです。

アプリケーションログに5分おきにイベント1030と1058が記録される。

2007/10/22
イベントID 1030:グループ ポリシー オブジェクトの一覧を照会できません。このエラーの理由を説明するようなメッセージをポリシー エンジンが記録していないかどうか、イベント ログを確認してください。

詳細な情報は、http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。
イベントID 1058:GPO cn={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX},cn=policies,cn=system,DC=example.co.jp,DC=example,DC=co,DC=jp 用のファイル gpt.ini にアクセスできません。ファイルは場所 <\\example01.co.jp\sysvol\example01.co.jp\Policies\[XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\gpt.ini> に存在する必要があります (アクセスが拒否されました。 )。グループ ポリシーの処理は中止されました。
詳細な情報は、http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。

いつのころからかこのエラーが5分置きに記録されていてうっとおしかったんで、調べたらKBにありました。
http://support.microsoft.com/kb/842804/ja
「グループ ポリシーの処理が機能せず、ドメイン コントローラのアプリケーション ログにイベント 1030 および 1058 が記録される」
ただ、最初読んだときは「最新のService Packで解決する。」と書いてあったので、「ウチは最新だからちがうのかなぁ」とスルーしてしまった。
かなり時間を使ってしまってから舞い戻り、精読したら、「注:Service Pack のインストール後でも、「レジストリ情報」に記載されている手順を実行する必要があります。」と書かれていたorz。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\WaitForNetwork]にDWORD値で1を設定し、再起動したら解決。
レジストリファイルが必要な方はどうぞ→http://www31.atwiki.jp/memo77/?cmd=upload&act=open&page=Active+Directory&file=WaitForNetwork.zip

dsaddを使ってActive Directoryにユーザーを追加する

2007/10/22 自分用のサンプル構文

dsadd user "CN=山田 太郎,OU=部門1,OU=Domain Users,DC=example01,DC=example,DC=or,DC=jp" -ln 山田 -fn 太郎 -display 山田 太郎 -upn taro-yamada@example.co.jp -pwd Example01 -mustchpwd yes -memberof "CN=総務部,OU=Security Groups,DC=example01,DC=example,DC=co,DC=jp" "CN=総務部長,OU=Security Groups,DC=example01,DC=example,DC=co,DC=jp" "CN=防火責任者,OU=Security Groups,DC=example01,DC=example,DC=co,DC=jp" "CN=プロジェクトチーム1,OU=Security Groups,DC=example01,DC=example,DC=co,DC=jp" -disabled no

グループポリシーオブジェクトエディタでびっくり

2007/08/28
ソフトウェアインストールのところにmsiファイルをドラッグ&ドロップできるのね。知らなかった。

レジストリの配布をグループポリシーでやるべきか

2007/08/23
スクリプト中でregedit /S "filepath" の方がシンプルで見通しがよく、即効性があるが・・・
手法 対象 特徴
グループポリシー HKLM ローカル管理者でも変更できない。
グループポリシー HKCU ローカル管理者でも変更できない。
スタートアップスクリプト HKLM ユーザーは変更できない。
ログオンスクリプト HKCU ユーザーが変更できる。

従って、
1.ユーザーが変更してもよいがデフォルト値を配布したい場合は一回だけregedit /s filename *1
2.HKCU対象でユーザーに変更させたくない値はグループポリシー(HKCU)
3.HKLM対象はスタートアップスクリプトでもグループポリシーでもよい。
 手間を考えるとスクリプト。ローカル管理者にも変更させたくなければグループポリシー。

MEMO:試してないけど疑問
1.Policyの下ってスクリプトで配布できるんだろか。
2.ローカル管理者ってほんとにPolicyを無効化することできない?

無線環境のPCにグループポリシーでアプリケーションを配布する。

2007/08/20 グループポリシーで設定してみても下記のエラーで失敗している。
「コンピュータ ネットワークためのドメイン コントローラ名を取得できません。(指定されたドメインがないか、またはアクセスできません。 )。グループ ポリシーの処理は中止されました。」
http://support.microsoft.com/kb/840669/ja
この記述にしたがってレジストリを修正すると成功した ⇒ 【regファイルダウンロード】
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"GpNetworkStartTimeoutPolicyValue"=dword:0000003c

admファイルを使用してレジストリを配布する

この辺を参考に http://tod.cocolog-nifty.com/diary/2007/07/active_director_450e.html
例えばユーザーのログイン時にOnlyDetlを実行するレジストリを設定するなら
CLASS USER 
CATEGORY !!CustomRegistry
 CATEGORY !!PathOfRun
 
  KEYNAME "Software\Policies\Microsoft\Windows\CurrentVersion\Run"
 
  POLICY !!OnlyDetl_Title
   EXPLAIN !!OnlyDetl_Explain
   PART !!OnlyDetl_Path   EDITTEXT
    VALUENAME OnlyDetl
    MAXLEN 60
   END PART
 
  END POLICY
 
 END CATEGORY
END CATEGORY
 
[strings]
 
CustomRegistry="配布レジストリ"
PathOfRun="ログイン時に実行するアプリケーション"
 
OnlyDetl_Title="OnlyDetl"
OnlyDetl_Explain="OnlyDetlの実行パスを設定します。"
OnlyDetl_Path="実行パス:"
という感じです。
注意事項として、コピペした使ったときに[strings]の後ろにスペースが入っていると、「[strings]セクションに文字列xxxが見つかりません」みたいなエラーで蹴られます。
かならず余分なスペースは除去しましょう。前後も1行空行のほうがよいかも。

ローカルセキュリティポリシーはDefault Domain Controllers Policyでなければ有効にならない?

2007/08/14
できるだけDefault Domain Controllers Policyをいじりたくないので、リモート専用のユーザーを別のGPOで指定してみたが有効にならなかった。
ローカルセキュリティポリシーはDefault Domain Controllers Policyでなければいけないのかもしれない。
※資料を見つけているわけではないので未確定情報です。もしご存知の方がいれば情報をいただけるとありがたいです。

Acrobat Reader 8.1をmsiファイルで配布する

2007/08/07
いまや Acrobat Reader は必須といってよいと思いますが、msiファイルとしては提供されていません。
しかし内部的にはmsiファイルで構成されており、下記の手順で抽出することができます。


間単に書くとこんな感じです。
1.http://ardownload.adobe.com/pub/adobe/reader/win/8.x/8.1/jpn/AdbeRdr810_ja_JP.exeをダウンロード
2.ダウンロードしたファイルをコマンドラインオプションをつけて実行
AdbeRdr810_ja_JP.exe -nos_ne-nos_ne
3.[C:\Documents and Settings\[ユーザー名]\Local Settings\Temp\Adobe Reader 8]に下記ファイルが出力される。
abcpy.ini
AcroRead.msi
Data1.cab
Setup.exe
setup.ini
4.AcroRead.msiとData1.cabを同じフォルダにおいて、グループポリシーで配布する。

Flash Player をmsiファイルで配布する

2007/08/08 adobeへの無料登録をするとダウンロードサイトのアドレスを貰えるようです。
http://d.hatena.ne.jp/tkssoft/20070602/p1

コンピュータ名の長さの制限など

2007/07/08
http://technet2.microsoft.com/WindowsServer/ja/library/8ec96981-6b1a-48ec-bd3e-d8d43bc814311041.mspx?mfr=true
とりあえずドメイン名まで含めてnvarchar(256)だけど、15文字以内に収めておくのが揉めない。

ADSI関連で物凄く参考になるサイト

スクリプトでOutlook Expressのアカウントを修正する

2007/07/02
契約してるホスティングサービスからメールアカウントのサーバー名を変更してくれと通知。
1台1台やってられないのでスクリプト作ってみた。
Outlook Expressのアカウントって、CurrentUserが使えないのね。SIDまで取らなきゃいけなかった。
グループポリシーでログオンスクリプトに設定して解決。

'ログインアカウントのSIDをWMIを使用して取得
Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
Set WshNetwork = WScript.CreateObject("WScript.Network")

Set oAccount = oWMI.Get ("Win32_UserAccount.Name='" & WshNetwork.UserName & "',Domain='" & WshNetwork.UserDomain & "'")

strKeyBase = oAccount.SID & "\Software\Microsoft\Internet Account Manager\Accounts"

'SIDに登録されたインターネットアカウントをレジストリから列挙
const HKEY_USERS = &H80000003
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
oReg.EnumKey HKEY_USERS, strKeyBase, arrSubKeys

'各アカウントの値をチェックして更新
For Each subkey In arrSubKeys
    strKeyPath = strKeyBase & "\" & subkey

    strValueName = "POP3 Server"
    oReg.GetStringValue HKEY_USERS, strKeyPath , strValueName, strValue
    If Not IsNull(strValue) Then
        If strValue="mail.example.co.jp" Then
            oReg.SetStringValue HKEY_USERS, strKeyPath , strValueName , "pop.example.co.jp"
        End IF
    End If

    strValueName = "SMTP Server"
    oReg.GetStringValue HKEY_USERS, strKeyPath , strValueName, strValue
    If Not IsNull(strValue) Then
        If strValue="mail.example.co.jp" Then
            oReg.SetStringValue HKEY_USERS, strKeyPath , strValueName , "smtp.example.co.jp"
        End IF
    End If

Next

ACLからフルコントロールを持つアカウントを削除してしまった場合の対処

2007/06/06
http://support.microsoft.com/kb/308421/ja
管理者アカウントで上位フォルダにて「サブコンテナとオブジェクトの所有者を置き換える」を行うと、アクセス権を変更できるようになる。
もともと所有者に管理者アカウントが表示されていても、これをやるのとやらないので挙動が違います。
検索語:NTFS/消せない/ファイル/継承/読み取り/変更/削除/SYSTEM/Administrators/フォーマット

ちゃうねん

2007/05/17
oがないのがレジストリ……
oがあるのがアクティブディレクトリ……

ちょっと時々ごっちゃになるねん
わかってるねん わかってるねんで? バカにしたらあかん
oがあるのがレジストリ それがごっちゃに……

わかってるねんで!?
正:Registry
誤:Registory

正:Active Directory
誤:Active Directry

信頼関係

2007/05/07 検索語:一方向の信頼関係/外部信頼関係
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28249&forum=6&8
2007/05/15 検索語:セキュリティグループ/グローバル/ドメインローカル/ユニバーサル
グループ・アカウントの種類を知る
http://www.atmarkit.co.jp/fwin2k/win2ktips/737groups/groups.html

Defaul Domain Policyの 復旧

2007/05/16
オペレートミスで[Defaul Domain Policy]を削除してしまうという失態。復旧について調査すると、dcgpofixというコマンドを使えばよいらしい。
http://www.atmarkit.co.jp/fwin2k/win2ktips/625dcgpofix/dcgpofix.html

やってみると下記エラーが出て復元に失敗する。
このドメインの Active Directory スキーマ バージョンと、このツールによってサポートされているバージョンが一致しません。GPO は /ignoreschema コマンド ライン パラメータを使用すると復元できます。ただし、このツールの更新バージョンを取得することをお勧めします。このツールの更新バージョンには、Active Directory スキーマの更新バージョンが含まれている可能性があります。間違ったスキーマで GPO を復元すると、予期しない動作が発生する場合があります。

原因は http://support.microsoft.com/kb/932445/ja
『Windows Server 2003 R2-based ドメインで Dcgpofix.exe コマンド ライン ツールを使用すると、エラー メッセージ:「このドメインのスキーマの Active Directory バージョンとこのツールによってサポートされたバージョンが一致しません」』

R2だと出るということ。/ignoreschemaオプションで強行する。

次のドメインの既定のドメイン ポリシーを復元しようとしています。
xxx.yyy.zzz.jp
続行しますか: <Y/N>? y
警告: この操作を行うと、選択された GPO で行われた 'ユーザー権利の割り当て' がすべて置き換えられます。これにより一部のサーバー アプリケーションでエラーが発生する可能性があります。 続行しますか: <Y/N>?
で[y]を押して実行。
既定のドメイン ポリシーは正しく復元されました
注意: 既定のドメイン ポリシーの内容のみが復元されました。このグループ ポリシーオブジェクトへのグループ >ポリシー リンクは変更されませんでした。
既定では、既定のドメイン ポリシーはドメインにリンクされています。

ドメインコントローラポリシーだと元にもどらない部分を手動で補正しなければいけないらしい。
http://support.microsoft.com/kb/833783/ja
今回はドメインポリシーなので無関係。

あとはポリシーオブジェクトをドメインにバインドして終了。
変な影響が出なければいいけど。


comment

このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。
  • コンピュータ名の一覧を元にローカルAdministratorのパスワードを変更するスクリプトの4行目、stLogPathではなくstrLogPathではないでしょうか。 -- (shimazoe) 2010-06-08 11:18:19
  • ご指摘ありがとうございます。たぶんそうだと思うので直しました。コピーミスかな? -- (memo77) 2010-06-08 11:55:04
  • 「XPクライアントに特定のユーザー/グループのみログインを許可する」を私もやっていますが、プリンタなどドライバインストールで失敗します。そんときだけ戻してます。 -- (を) 2010-06-13 20:25:02
名前:
コメント:

すべてのコメントを見る

最終更新:2010年10月14日 22:11
添付ファイル