おそらく変数を使用するつもりの場合は、文字列 を使用します。これを変える:"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\Domain
domainname\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
メソッドを介してコマンドを実行することです。そうすれば、作成されたプロセスのStdOutとStdErrにアクセスできます。
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