【復活求む!】惜しくも解散してしまったバンド|J-ROCK編 >>

こんにちは。
OSはWindows2000 Proです。
共有フォルダを作成し、NTFSのアクセス権を
caclsコマンドで一括変更する処理は可能です
が、共有タブにあるアクセス許可で、同じよう
にアクセス権を変更するバッチファイルを作成
したいのですが、どのようなコマンドを使用す
ればよろしいでしょうか?
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ANo.#2には問題があったので


書き直しました。

Option Explicit

Dim Services
Dim SecDescClass
Dim SecDesc
Dim Trustee
Dim ACE1
Dim ACE2
Dim Share
Dim InParam

Const FolderName = "C:\public"
Const ImpLevel = "{impersonationLevel=impersonate}"
Const namespace = "!root\cimv2:"
Const ComputerName = "ittochan"
Const ShareName = "Pubs"

Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!\\.\ROOT\CIMV2")
Set SecDescClass = Services.Get("Win32_SecurityDescriptor")
Set SecDesc = SecDescClass.SpawnInstance_()

Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Trustee.Domain = Null
Trustee.Name = "Administrators"
Trustee.Sid = getSID(Trustee.Name)

Set ACE1 = Services.Get("Win32_Ace").SpawnInstance_
ACE1.AccessMask = 2032127
ACE1.AceFlags = 3
ACE1.AceType = 0
ACE1.Trustee = Trustee

Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Trustee.Domain = ComputerName
Trustee.Name = "Everyone"

Trustee.SID = getSID(Trustee.Name)

Set ACE2 = Services.Get("Win32_Ace").SpawnInstance_
ACE2.AccessMask = 2032127
ACE2.AceFlags = 3
ACE2.AceType = 0
ACE2.Trustee = Trustee
'
SecDesc.DACL = Array(ACE1,ACE2)

Set Share = Services.Get("Win32_Share")
Set InParam = Share.Methods_("Create").InParameters.SpawnInstance_()
InParam.Properties_.Item("Access") = SecDesc
InParam.Properties_.Item("Description") = "Public Share"
InParam.Properties_.Item("Name") = ShareName
InParam.Properties_.Item("Path") = FolderName
InParam.Properties_.Item("Type") = 0
InParam.Properties_.Item("MaximumAllowed") = 5
Share.ExecMethod_ "Create", InParam

WScript.Quit

function getSID(ByVal strUserName)
dim objWMIService
dim colAccount , colItems , objItem
dim ClasSID , strMoniker , strSID , obj
dim instance

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colAccount = objWMIService.ExecQuery( _
"Select * from Win32_Account where name='" & strUserName & "'")
for each obj in colAccount
if LCase(obj.name)=LCase(strUserName) then
strSID = obj.SID
end if
next
if strSID="" then
WScript.Echo strUserName & "というユーザー名または、グループ名が見つかりません"
WScript.Echo "失敗しました"
WScript.Quit
else
strMoniker = "winmgmts:" & ImpLevel & namespace & _
"Win32_SID.SID='" & strSID & "'"
Set instance = GetObject(strMoniker)
getSID=instance.BinaryRepresentation
end if
end function
    • good
    • 0

実は


「WSH(VBScript)で共有フォルダを作成したい」の件で
後日色々調べてみたんです。
あの時、
『WSHにはアクセス許可の編集機能は無いと思うので』
って書いたことを後悔していたんですが、
タイミングよくenakoさんが質問してくれてよかったです。

もちろんローカルのアクセス許可も編集可能です。
    • good
    • 0

できました。


完成版を書きますね。

'既存の共有フォルダのアクセス許可にユーザーを追加
Option Explicit

Dim i,j
Dim FSO
Dim Services
Dim SecDescClass
Dim SecDesc
dim wmiAce
dim wmiTrustee
Dim Trustee
Dim ACE
Dim Trustee1
Dim ACE1
dim strMoniker
dim wmiShareSecSetting
dim RetVal
Dim DACL
Dim controlFlags
Dim accessmask
Dim Group
Dim Owner
Dim SACL
Dim number_of_trustees
Dim trustee_Domain
Dim trustee_Name
Dim trustee_Sidstring
Dim strACL
Dim wmiSecurityDescriptor
dim strSID

'' アクセス権のマスク
Const FULLACCESS = 2032127 '' フルアクセス(All)
Const READ = 1179817 '' 読み取り(RX)
Const UPDATE = 1245631 '' 変更(RWXD)

Const ComputerName = "ittochan"
Const ShareName = "Pubs"

Const ImpLevel = "{impersonationLevel=impersonate}"
Const namespace = "!root\cimv2:"
Const objectpath = _
"Win32_LogicalShareSecuritySetting=""Pubs"""
strMoniker = "winmgmts:" & ImpLevel & namespace & objectpath

Set wmiShareSecSetting = GetObject (strMoniker)

'' セキュリティディスクリプタを取得し、wmiSecurityDescriptorに格納する。
RetVal = wmiShareSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)
If Err <> 0 Then
WScript.Echo "GetSecurityDescriptor failed" & VBCRLF & Err.Number & VBCRLF & Err.Description
WScript.Quit
Else
WScript.Echo "GetSecurityDescriptor suceeded"
End If

'' セキュリティディスクリプタから情報を取得する。
DACL = wmiSecurityDescriptor.DACL ' get dacl

DispDACL

Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!" & "\\" & ComputerName & "\ROOT\CIMV2")

'既存のACLを上書きする
j=0
For each wmiAce in DACL
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Set wmiTrustee = wmiAce.Trustee
Trustee.Domain = wmiTrustee.Domain
Trustee.Name = wmiTrustee.Name

Trustee.SID = wmiTrustee.SID
ACE.AccessMask = wmiAce.AccessMask
''Everyoneのアクセス権をフルアクセスに変更する
'if Trustee.Name="Everyone" then
'ACE.AccessMask = FULLACCESS
'end if
ACE.AceFlags = wmiAce.AceFlags
ACE.AceType = wmiAce.AceType
ACE.Trustee = Trustee

wmiSecurityDescriptor.DACL(j) = ACE
j=j+1
Next

'新しいACLを作成
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Trustee.Domain = ComputerName
Trustee.Name = "Administrator"
Trustee.Sidstring = getSID(Trustee.Name)

ACE.AccessMask = READ
ACE.AceFlags = 3
ACE.AceType = 0
ACE.Trustee = Trustee

'DACLに追加する
wmiSecurityDescriptor.DACL(j) = ACE

retval = wmiShareSecSetting.setsecuritydescriptor(wmiSecurityDescriptor)
If retval = 0 Then
WScript.Echo "成功しました。"
WScript.Echo ""
DispDACL
Else
WScript.Echo "セキュリティ設定を変更できませんでした。"
End If

Set wmiShareSecSetting = Nothing

WSCript.Quit

sub DispDACL()
Set wmiShareSecSetting = GetObject (strMoniker)
'' セキュリティディスクリプタを取得し、wmiSecurityDescriptorに格納する。
RetVal = wmiShareSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)

'' セキュリティディスクリプタから情報を取得する。
DACL = wmiSecurityDescriptor.DACL ' get dacl

For each wmiAce in DACL
Set wmiTrustee = wmiAce.Trustee
strSID=""
For i = 0 To UBound(wmiTrustee.SID) - 1
strSID = strSID & wmiTrustee.SID(i) & ","
Next
strSID = strSID & wmiTrustee.SID(i)

'アクセスマスクの取得
accessmask = wmiAce.AccessMask ' Save the accessmask

' アクセスマスクをアクセス権表示文字列に変換する。
Select Case accessmask
Case FULLACCESS
strACL = "フルコントロール(All)"
Case READ
strACL = "読み取り(RX)"
Case UPDATE
strACL = "変更(RWXD)"
Case Else
strACL = accessmask
End Select

WScript.Echo "Domain:" & wmiTrustee.Domain & vbNewLine _
& "Name:" & wmiTrustee.Name & vbNewLine _
& "SID:" & strsid & vbNewLine _
& "Sidstring:" & wmiTrustee.Sidstring & vbNewLine _
& "ACL:" & strACL & vbNewLine _
& "AccessMask:" & accessmask
Next
end sub
function getSID(ByVal strUserName)
dim objWMIService
dim colUserAccount
dim colGroup
dim obj

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colUserAccount = objWMIService.ExecQuery("Select * from Win32_UserAccount")
for each obj in colUserAccount
if LCase(obj.name)=LCase(strUserName) then
getSID = obj.SID
exit function
end if
next
Set colGroup = objWMIService.ExecQuery("Select * from Win32_Group")
for each obj in colGroup
if LCase(obj.name)=LCase(strUserName) then
getSID = obj.SID
exit function
end if
next
WScript.Echo strUserName & "というユーザー名または、グループ名が見つかりません"
WScript.Echo "失敗しました"
WScript.Quit
    • good
    • 0
この回答へのお礼

ittochanさん、こんにちは。
更なる「大作」をありがとうございます。
やはり、WSHは奥が深いことを思い知ら
されました。時間がかかりそうですが、
必ずやこのスクリプトを自分のものに
してみせます!
どうもありがとうございました。

お礼日時:2004/03/16 09:26

WindowsXP+WSH+WMI


を使用したVBScriptでしたら可能です。
多分Windows2000でも動くでしょう。

↓は
C:\Publicフォルダを新規作成し、
共有フォルダPubsとして構成、
共有フォルダのアクセス許可リストに
フルコントロールのEveryoneを追加しています。

他のユーザーの追加方法はいまのところ分かりません。
すでにアクセス許可リストに登録されているユーザーなら変更することが可能なんですが・・・・

Option Explicit

Dim FSO
Dim Services
Dim SecDescClass
Dim SecDesc
Dim Trustee
Dim ACE
Dim Share
Dim InParam
Dim Network

Const FolderName = "C:\Public"
Const ComputerName = "ittochan"
Const ShareName = "Pubs"

Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.FolderExists(FolderName) Then
FSO.CreateFolder(FolderName)
End If

Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!" & "\\" & ComputerName & "\ROOT\CIMV2")
Set SecDescClass = Services.Get("Win32_SecurityDescriptor")
Set SecDesc = SecDescClass.SpawnInstance_()
Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Trustee.Domain = ComputerName
Trustee.Name = "EVERYONE"
Trustee.Properties_.Item("SID") = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
ACE.Properties_.Item("AccessMask") = 2032127
ACE.Properties_.Item("AceFlags") = 3
ACE.Properties_.Item("AceType") = 0
ACE.Properties_.Item("Trustee") = Trustee
SecDesc.Properties_.Item("DACL") = Array(ACE)
Set Share = Services.Get("Win32_Share")
Set InParam = Share.Methods_("Create").InParameters.SpawnInstance_()
InParam.Properties_.Item("Access") = SecDesc
InParam.Properties_.Item("Description") = "Public Share"
InParam.Properties_.Item("Name") = ShareName
InParam.Properties_.Item("Path") = FolderName
InParam.Properties_.Item("Type") = 0
Share.ExecMethod_ "Create", InParam
    • good
    • 0
この回答へのお礼

ittochanさん、こんにちは。
私にとって大作をどうもありがとうございます。
一筋縄ではいかないようですが、じっくり研究
し解読してみようと思います。
どうもありがとうございました。

お礼日時:2004/03/12 10:28

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QWSH(VBScript)で共有フォルダを作成したい

こんにちは。
OSはWIN2K,WSHは5.6を使用しています。
ドメインユーザーでログオンし、「D:\共有」
フォルダが存在しないならそれを作成し、
共有をかけ、アクセス許可はドメインユーザ
が所属するグループだけにフルコントロール
を許可したいのですが、どのようなスクリプト
で実現可能でしょうか?
よろしくお願いいたします。

Aベストアンサー

>アクセス許可は
WSHにはアクセス許可の編集機能は無いと思うので
コマンドラインのCaclsを
runメソッドか、execメソッドで起動させる必要があるかも。

QWSH(VBS)でNTFSのアクセス権の付け方を教えてください

MS-DOSのCACLSにあたるWSH(VBS)の使い方が
分かりません。教えて頂けないでしょうか?
WINDOWSのNTFSに存在するファイルに対し
スクリプトにてアクセス権付与をしたいと
考えています。
何卒よろしくお願い致します。

Aベストアンサー

以前、私が作成したVBSです。
参考になれば。

c:\scripts\test.txt
のアクセス許可を変更します。

Option Explicit

Dim instance
Dim strMoniker
Dim objDescriptor
Dim retval
Dim DACL
Dim controlFlags
Dim accessmask
Dim Group
Dim Owner
Dim SACL
Dim number_of_trustees
Dim trustee_Domain
Dim trustee_Name
Dim trustee_Sidstring
Dim i
Dim strACL

'' アクセス権のマスク
Const FULLACCESS = 2032127 '' フルアクセス(All)
Const READ = 1179817 '' 読み取り(RX)
Const UPDATE = 1245631 '' 変更(RWXD)
Const R = 1179785 '' 特殊なアクセス権(R)
Const W = 1179926 '' 特殊なアクセス権(W)
Const X = 1179808 '' 特殊なアクセス権(X)
Const D = 65536 '' 特殊なアクセス権(D)
Const P = 262144 '' 特殊なアクセス権(P)
Const O = 524288 '' 特殊なアクセス権(O)

Const ImpLevel = "{impersonationLevel=impersonate}"
Const namespace = "!root\cimv2:"
Const objectpath = _
"Win32_LogicalFileSecuritySetting=""c:\\scripts\\test.txt"""
strMoniker = "winmgmts:" & ImpLevel & namespace & objectpath

Set instance = GetObject(strMoniker)
If instance Is Nothing Then
MsgBox ("インスタンスを取得出来ません。")
WSCript.Quit
End If

retval = instance.getsecuritydescriptor(objDescriptor)

Set DACL = objDescriptor.Properties_.Item("dacl") ' get dacl
controlFlags = objDescriptor.Properties_.Item("controlflags")
Set Group = objDescriptor.Properties_.Item("Group")
Set Owner = objDescriptor.Properties_.Item("Owner")
Set SACL = objDescriptor.Properties_.Item("Sacl")

number_of_trustees = UBound(DACL.Value)

WScript.Echo "ドメイン名\ユーザ名:SID\アクセス権\アクセスマスク"

For i = 0 To number_of_trustees
Set trustee_Domain = DACL.Value(i).Properties_.Item _
("trustee").Value.Properties_.Item("Domain")
Set trustee_Name = DACL.Value(i).Properties_.Item _
("trustee").Value.Properties_.Item("Name")
Set trustee_Sidstring = DACL.Value(i).Properties_.Item _
("trustee").Value.Properties_.Item("Sidstring")

accessmask = DACL.Value(i).Properties_.Item _
("AccessMask").Value ' Save the accessmask

Select Case accessmask
Case FULLACCESS
strACL = "フルコントロール(All)"
Case READ
strACL = "読み取り(RX)"
Case UPDATE
strACL = "変更(RWXD)"
Case Else
strACL = accessmask
End Select

WScript.Echo trustee_domain & "\" & trustee_name & ":" & trustee_Sidstring & ":" & strACL & ":" & accessmask

If trustee_name = "Administrators" Then
'アクセス許可の設定
'Administratorsを「読み取り」にする
objDescriptor.Properties_.Item("dacl").Value(i).Properties_.Item _
("AccessMask").Value = R
End If

Next

retval = instance.setsecuritydescriptor(objDescriptor)
If retval = 0 Then
MsgBox "成功しました。"
Else
MsgBox "セキュリティ設定を変更できませんでした。"
End If

Set instance = Nothing

WSCript.Quit

以前、私が作成したVBSです。
参考になれば。

c:\scripts\test.txt
のアクセス許可を変更します。

Option Explicit

Dim instance
Dim strMoniker
Dim objDescriptor
Dim retval
Dim DACL
Dim controlFlags
Dim accessmask
Dim Group
Dim Owner
Dim SACL
Dim number_of_trustees
Dim trustee_Domain
Dim trustee_Name
Dim trustee_Sidstring
Dim i
Dim strACL

'' アクセス権のマスク
Const FULLACCESS = 2032127 '' フルアクセス(All)
Const READ = 1179817 '' 読み取り(RX)
Con...続きを読む

QVBSで共有フォルダのセキュリティー設定を取得は?

VBScript(あるいはPowerShell)でサーバー(Wndows 2008 Server)上の共有フォルダのセキュリティー設定を取得する方法を探しています。サーバー上に共有フォルダを作成してセキュリティー設定する方法ならネットで見かけるのですが。サーバーを監視して、上位からの継承が途切れている所、アクセス権設定がセキュリティーグループ名じゃなく個人になっているなど注意すべき点を探すプログラムを書こうとしているのです。

Aベストアンサー

御存知かもしれませんが、xcacls.vbs ではWindowsXP迄ですが
アクセス権の取得・変更が出来ました。
http://jehupc.exblog.jp/13482584
Windows Server 2008 では修正が必要ですが、ゼロから始めるよりはマシかと。

PowerShell は使ったことが無いのですがGoogleと
http://wsbs.wordpress.com/2011/11/04/powershell%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9%E4%B8%80%E8%A6%A7%E3%81%AE%E5%8F%96%E5%BE%97/
ご参考まで。

Qフォルダ、ファイルのアクセス権設定状態を確認したい

 「Windows2000ServerSP4」上に設定している、フォルダ(サブフォルダ含む)、ファイルのアクセス権設定状態を一覧したいのですが、良い方法はありませんか。
 フリーソフトでも良いのですが。

 確認したいのは、[セキュリティ]のアクセス権の状態で、[共有]-[アクセス許可]については『everyone』が設定してあるので必要ありません。

 ただ、フォルダには、サブフォルダがいくつもあり、そのサブフォルダは上位の継承権を外してアクセス権を設定しているものも中にはあります。
 また、アクセス権はグループ単位だけではなく、ドメインユーザーの個人でも付与しているフォルダ、ファイルがいくつもあります。

 これをひとつ、ひとつのフォルダの[プロパティ]-[セキュリティ]を開くことなく、一覧表形式(などで)わかりやすく確認したいと思います。

 どうかよろしく願いいたします。

Aベストアンサー

ちょっとお望みのものとは違うかもしれませんが
コマンドプロンプトで

cacls そのフォルダ /T

としてみる

QDOSコマンドで共有ファイルへアクセスを行う際のパスの書き方

初めまして。

本題になります・・・

DOSコマンドで共有ファイルのアクセスを行う際のパスの書き方は、
「\\サーバー名\共有フォルダ名\ファイル名」ですが、DIRなどを行うと、認証が走って、ファイルへのアクセスが出来ません・・・全てDOSコマンド(バッチ)で完結したいのですが・・・
例えば、「dir \\サーバー名\共有フォルダ名\ファイル名」とした場合に、「ログオン失敗: ユーザー名を認識できないか、またはパスワードが間違っています。」と表示されてしまいます。
現在行いたい処理は、他サーバーの「共有ファイルのコピー&削除」、「共有フォルダの作成」です。

【環境】
コマンド実行させるサーバー:[WIN2KSEVER(admini権限/パスワード共通)]
他サーバー:[WIN2KSERVER(admini権限/パスワード共通)]

解決する方法がありましたら、お教え下さい。
お願いします。

Aベストアンサー

実際に試してみました。

net use \\サーバー名 パスワード /user:ユーザー名
dir \\サーバー名\共有フォルダ名\ファイル名

でいけました。

QVBScript(WHS)でWMIを使ってリモートでvbsファイルを実行したい

サーバAから、サーバBに置いてあるvbsファイル(Apache停止が書かれている)を実行して、サーバBのApacheを停止したいのですが、うまくいきません。
サーバBで単体でそのvbsファイルを実行すると、Apacheは正常に停止します。
 戻り値は、0(プロセス完了)が帰ってきていて、接続はうまくいっているようなのですが、vbsファイルが実行されていないようです。
 非常に困っておりまして、どなたか教えていただけないでしょうか?

vbsファイルの実行のところが間違っているのかなと思うのですが・・・(今まだ会社にいないので、会社でのソースそのままではないですが、同じような感じです)
--------------------------------------------
Option Explicit

Dim strComputer
Dim strUser
Dim strPassword
Dim strBAT

' -----------------------------------
' 環境設定
' -----------------------------------
strComputer = "サーバーB"
strUser = "username"
strPassword = "password"
strBAT = "c:\hoge.bat"

' -----------------------------------
' コマンド実行
' -----------------------------------
Dim objWbemLocator
Dim objWMIService
Dim objWin32_Process
Dim errReturn
Dim intProcessID

Const WbemAuthenticationLevelPktPrivacy = 6


' リモートに接続
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer _
(strComputer, "root\cimv2", strUser, strPassword)

objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy

' Win32_Process クラスを生成
Set objWin32_Process = objWMIService.Get("Win32_Process")

errReturn = objWin32_Process.Create _
("cmd.exe /cscript C:\tmp\ApacheStop.vbs", Null, Null, intProcessID)
WScript.Quit(errReturn )


もともとの要件は、機能ごとに分けたvbsファイル(Apache停止、Windows再起動、ファイルバックアップなど)を、各サーバで実行するというものです。その制御は、ひとつのバックアップサーバーで行います。

サーバAから、サーバBに置いてあるvbsファイル(Apache停止が書かれている)を実行して、サーバBのApacheを停止したいのですが、うまくいきません。
サーバBで単体でそのvbsファイルを実行すると、Apacheは正常に停止します。
 戻り値は、0(プロセス完了)が帰ってきていて、接続はうまくいっているようなのですが、vbsファイルが実行されていないようです。
 非常に困っておりまして、どなたか教えていただけないでしょうか?

vbsファイルの実行のところが間違っているのかなと思うのですが・・・...続きを読む

Aベストアンサー

正式なコードではないということなので細かいミスは無視する方向で。

1.実行アカウントについて
実行するユーザーアカウントは、接続するユーザーアカウントと異なるのですか?
異なるのであれば問題ありません。
同じであれば、この記述は冗長です。

2.実行する実体について
C:\tmp\ApacheStop.vbs はこのスクリプトを実行するサーバー側に保存されていますか?

3.cscript は cmd を使わなくても実行できますよ。

4.イベントログの失敗の監査を有効にしてみてください。
 実行に失敗すると、セキュリティログかどこかに記録されるかもしれません。
 objWin32_Process.Create 以外のところで問題があれば記録されます。

QNET USE をVBSで

初めて質問させていただきます。よろしくお願いいたします。
現在、下記のコマンドと同じ処理をVBSで実現させたく考えておりますが知識が無く困っております。

net use \\node1\share1 /user:oji passwd

大変勝手なお願いなのですが、自分で勉強する時間がないので、ズバリのご回答頂けないでしょうか?

よろしくお願いいたします。

Aベストアンサー

一応VBSでドライブの割り当てをチェックしてから割り当てるサンプルプログラムを作ってみました。
注:他のユーザ名で既に何処かの共有フォルダを使用している場合は、複数のユーザー名が使えないというエラーになります。その場合は、他のユーザー名での接続を切断する必要があります。
'空いているドライブ名にネットワークドライブを割り当てる
dim objFs, objNet, DriveLetter, Drive
dim i

Set objNet = WScript.CreateObject("WScript.Network")
Set objFs = WScript.CreateObject("Scripting.FileSystemObject")
DriveLetter="DEFGHIJKLMNOPQRSTUVWXYZ"
for i=1 to Len(DriveLetter)
Drive = Mid(DriveLetter,i,1)
if not objFs.DriveExists(Drive) then '指定したドライブが見つからない
Drive = Drive & ":"
exit for
end if
next
if Len(Drive) = 1 then
WScript.Echo "割り当てるべきドライブ名の空きがありません"
WScript.Quit(1)
end if
'WScript.Echo Drive
objNet.MapNetworkDrive Drive, "\\2000Server\share1",,"oji","ojipassword"
if objFs.FileExists(Drive & "\Target1.dat") then
WScript.Echo "YES" '実際の処理を書く
end if
objNet.RemoveNetworkDrive Drive

一応VBSでドライブの割り当てをチェックしてから割り当てるサンプルプログラムを作ってみました。
注:他のユーザ名で既に何処かの共有フォルダを使用している場合は、複数のユーザー名が使えないというエラーになります。その場合は、他のユーザー名での接続を切断する必要があります。
'空いているドライブ名にネットワークドライブを割り当てる
dim objFs, objNet, DriveLetter, Drive
dim i

Set objNet = WScript.CreateObject("WScript.Network")
Set objFs = WScript.CreateObject("Scripting.Fi...続きを読む

QVBA フォルダ アクセス権限付与

VBAでフォルダのアクセス権限を付与する方法ってありますでしょうか?
VBではあるらしいと噂を聞いたのですが、VBAでは・・・

VBAの中でコマンドプロンプトなどの方法でも構いません。
プログラミング関係に詳しいかたいましたら、よろしくお願いします。

Aベストアンサー

Windows Professionalバージョン以降でしたら、コマンドプロンプトの、Cacls が
使えるかもしれません。
Windows7で見たら、Icacls を使ってください・・とのことでした。
WinXPの時は、MS社謹製の、Xcacls.vbs を使ったことが有りましたが
そちらの環境で使えるのか不明です。
Cacls、Icacls、Xcacls.vbs や
VBS アクセス権 取得 などでGoogleって見てください。+ PowerShell

Windows Vista 以降は、UAC という難敵が登場しましたので、
VBAから上記を使って処理しようとしても蹴られてしまうかも?
まったく詳しくないので、ここまで。

QAccess VBA で フォルダ権限をチェックする

フォルダの有無を以下のようにチェックして
フォルダがあった場合はフォルダの権限をチェックしてそのフォルダ内にmdbを作成するという事を行いたいのですが、
フォルダのアクセス権限かあるかどうかのチェックの仕方がわかりません。

Dim ExtDirName1 AS String
ExtDirName1 = "C:\TEMP

If (objFileSys.FolderExists(ExtDirName1) = True) Then
  'ここでフォルダのアクセス権限をチェック
'フォルダがあった場合はこのフォルダにmdbを作成
End IF


よろしくお願いします。

Aベストアンサー

MDB を作成 ( CreateDatabase ? ) するところを
On Error GoTo ...
でトラップしてやるのが簡単だと思いますけど・・・。
API の GetFileSecurity を使用してやれば、アクセス権があるかどうか調べることができると思います。なかなか面倒臭そうな気がしますが。
http://www.vbstation.net/spec/S6.htm
にサンプルがあるみたいですので、見てみてはいかがでしょうか。

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング