1

700 人以上のユーザーがいるネットワークがあり、ホーム フォルダーの所有者をドメイン管理者に変更し、サブフォルダーをユーザー自身に変更できるスクリプトを作成したいと考えています。

これは大学の助けを借りて作成できたものですが、何らかの理由で機能しません。誰でも私を助けてください。ありがとう。

Set objFSO  = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("G:\Userhome\userdirlist.txt", 1)

Set oShell  = WScript.CreateObject("WSCript.shell")

Do Until objFile.AtEndOfStream

    struserfolder = objFile.ReadLine

    oshell.run ("icacls G:\userhome\"+ struserfolder +"\*.*  /setowner domainname\" + "struserfolder" + " /t")
    oshell.run ("icacls G:\userhome\"+ struserfolder +"\*.*  /setowner domainname\Domain Admins")
Loop
4

1 に答える 1

2

おそらく変数を使用するつもりの場合は、文字列 を使用します。これを変える:"struserfolder" struserfolder

oshell.run ("icacls G:\userhome\"+ struserfolder +"\*.* /setowner domainname\" _
  + "struserfolder" + " /t")

これに:

oshell.run "icacls G:\userhome\"+ struserfolder +"\*.* /setowner domainname\" _
  + struserfolder + " /t"

また、引数はスペースで引用する必要があります。ではなく にicacls所有者を設定しようとするため、引用符がないことがおそらく 2 番目のコマンドの動作を妨げている原因です。これは次のことを行う必要があります。domainname\Domaindomainname\Domain Admins

oshell.run "icacls G:\userhome\" + struserfolder _
  + "\*.* /setowner ""domainname\Domain Admins"""

ところで、なぜ所有者を 2 回変更しようとしているのですか? どのオブジェクトも所有者を 1 人だけ持つことができ、ドメイン管理者グループをフォルダー内の最上位オブジェクトのみの所有者にすると、何も得られません。

ドメイン管理者にユーザーのホーム ディレクトリへのアクセスを許可する場合は、所有者をローカル管理者グループに変更し (ドメイン管理者は自動的にそのグループのメンバーになります)、フォルダーに対するフル コントロールを管理者、SYSTEM、およびユーザーに付与します。次に、変更されたアクセス許可をディレクトリ ツリーに伝達します。

path = Chr(34) & "G:\userhome\" & struserfolder & Chr(34)

oshell.run "icacls " & path & " /setowner Administrators /t /c"
oshell.run "icacls " & path & " /grant Administrators:(OI)(CI)F " _
  & "SYSTEM:(OI)(CI)F domainname\" & struserfolder & ":(OI)(CI)F"
oshell.run "icacls " & path & " /reset /t /c"

編集:このRunメソッドは、実行されたコマンドの終了ステータスを返します。これにより、期待どおりに動作しない場合にいくつかのポインターが得られる場合があります。

rc = oshell.run("icacls " & path & " /setowner Administrators /t /c", 0, True)
WScript.Echo "icacls returned with exit code " & rc & "."

1 つの問題は、デフォルトRunでは非同期 (パラメータのbWaitOnReturnデフォルトは) であることです。つまり、コマンド ( ) がまだバックグラウンドで実行されているFalse間に呼び出しがすぐに返されます。icaclsこれにより、後続のコマンドが、所有権がまだ取得されていないオブジェクトのアクセス許可を変更しようとする状況につながる可能性があります。

通常、コマンドの出力は戻りコードよりもさらに役立ちます。ただし、コマンドの実行方法では、コマンド ウィンドウが表示されず、表示されていたとしても、コマンドが終了するとすぐに自動的に閉じられます。ただし、コマンド ウィンドウを強制的に表示し、コマンドの終了後も開いたままにすることができます。

oshell.run "%COMSPEC% /k icacls " & path & " /setowner Administrators /t /c" _
  , 1, True

もちろん、通常は本番環境では必要ありませんが、スクリプトをデバッグするときに非常に便利です。

別のオプションは、Run完全に回避して、Execメソッドを介してコマンドを実行することです。そうすれば、作成されたプロセスのStdOutStdErrにアクセスできます。

Set icacls = oshell.Exec("icacls " & path & " /setowner Administrators /t /c")
Do While icacls.Status = 0
  WScript.Sleep 100
Loop
WScript.Echo "icacls returned with exit code " & icacls.ExitCode & "."
WScript.Echo icacls.StdOut.ReadAll & icacls.StdErr.ReadAll
于 2013-03-29T18:40:28.010 に答える